【Java NIO深入研究3】文件锁

1.1概述——文件锁

 

文件锁定初看起来可能让人迷惑。它 似乎 指的是防止程序或者用户访问特定文件。事实上,文件锁就像常规的 Java 对象锁 — 它们是 劝告式的(advisory) 锁。它们不阻止任何形式的数据访问,相反,它们通过锁的共享和获取赖允许系统的不同部分相互协调。

 

您可以锁定整个文件或者文件的一部分。如果您获取一个排它锁,那么其他人就不能获得同一个文件或者文件的一部分上的锁。如果您获得一个共享锁,那么其他人可以获得同一个文件或者文件一部分上的共享锁,但是不能获得排它锁。文件锁定并不总是出于保护数据的目的。例如,您可能临时锁定一个文件以保证特定的写操作成为原子的,而不会有其他程序的干扰。

 

大多数操作系统提供了文件系统锁,但是它们并不都是采用同样的方式。有些实现提供了共享锁,而另一些仅提供了排它锁。事实上,有些实现使得文件的锁定部分不可访问,尽管大多数实现不是这样的。

 

在本节中,您将学习如何在 NIO 中执行简单的文件锁过程,我们还将探讨一些保证被锁定的文件尽可能可移植的方法。

 

1.2文件锁定和可移植性

 

文件锁定可能是一个复杂的操作,特别是考虑到不同的操作系统是以不同的方式实现锁这一事实。下面的指导原则将帮助您尽可能保持代码的可移植性:

只使用排它锁。

将所有的锁视为劝告式的(advisory)。

public class UseFileLocks
{static private final int start = 10;static private final int end = 20;static public void main( String args[] ) throws Exception {new Thread(new Runnable() {public void run() {// Get file channelRandomAccessFile raf = null;try {raf = new RandomAccessFile( "usefilelocks.txt", "rw" );} catch (FileNotFoundException e) {// TODO Auto-generated catch block
                e.printStackTrace();}FileChannel fc = raf.getChannel();// Get lockSystem.out.println( "trying to get lock" );FileLock lock = null;try {lock = fc.lock( start, end, false );} catch (IOException e) {// TODO Auto-generated catch block
                e.printStackTrace();}System.out.println( "got lock!" );// PauseSystem.out.println( "pausing" );try { Thread.sleep( 5000 ); } catch( InterruptedException ie ) {}// Release lockSystem.out.println( "going to release lock" );try {lock.release();} catch (IOException e) {// TODO Auto-generated catch block
                e.printStackTrace();}System.out.println( "released lock" );try {raf.close();} catch (IOException e) {// TODO Auto-generated catch block
                e.printStackTrace();}}}).start();new Thread(new Runnable() {public void run() {// Get file channelRandomAccessFile raf = null;try {raf = new RandomAccessFile( "usefilelocks.txt", "rw" );} catch (FileNotFoundException e) {// TODO Auto-generated catch block
                e.printStackTrace();}FileChannel fc = raf.getChannel();// Get lockSystem.out.println( "trying to get lock" );FileLock lock = null;try {lock = fc.lock( start, end, false );} catch (IOException e) {// TODO Auto-generated catch block
                e.printStackTrace();}System.out.println( "got lock!" );// Release lockSystem.out.println( "going to release lock" );try {lock.release();} catch (IOException e) {// TODO Auto-generated catch block
                e.printStackTrace();}System.out.println( "released lock" );try {raf.close();} catch (IOException e) {// TODO Auto-generated catch block
                e.printStackTrace();}}}).start();}}

运行结果:

trying to get lock
trying to get lock
got lock!
going to release lock
released lock
Exception in thread "Thread-0" java.nio.channels.OverlappingFileLockException
at sun.nio.ch.SharedFileLockTable.checkList(Unknown Source)
at sun.nio.ch.SharedFileLockTable.add(Unknown Source)
at sun.nio.ch.FileChannelImpl.lock(Unknown Source)
at zhongqiu.common.base.nio.UseFileLocks$1.run(UseFileLocks.java:28)
at java.lang.Thread.run(Unknown Source)

转载于:https://www.cnblogs.com/guweiwei/p/6527059.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/393554.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2018-2019-2 网络对抗技术 20165202 Exp9 Web安全基础

博客目录 一、实践内容 跨站脚本攻击XSS跨站请求伪造CSRFSQL注入攻击二、实验中遇到的问题及解决三、基础问题回答四、实验总结一、实践内容 本实践的目标理解常用网络攻击技术的基本原理。Webgoat实践下相关实验。具体过程: 跨站脚本攻击XSS跨站请求伪造CSRFSQL注入…

leetcode696. 计数二进制子串

给定一个字符串 s,计算具有相同数量0和1的非空(连续)子字符串的数量,并且这些子字符串中的所有0和所有1都是组合在一起的。 重复出现的子串要计算它们出现的次数。 示例 1 : 输入: “00110011” 输出: 6 解释: 有6个子串具有相同数量的连续1和0&#…

idea无法忍受_不要成为无法忍受的软件开发人员

idea无法忍受by Bruce Flow通过布鲁斯流 不要成为无法忍受的软件开发人员 (Don’t be the software developer you can’t stand working with) I have more than 10 years of industry experience as a software developer. I am working at one of the largest tech compani…

项目需求分析答辩总结

前言 组长成员★530 雨勤311 旭403 俊223 元437 海辉你一定也不想做的 本次作业没什么可看的 项目需求分析看完记得投币的 一分钟宣传视频本组对其他各组评审结果 编号团队名称项目名称报告格式/20演示内容/20答辩内容/20PPT制作/20演讲/20总分/1001天机组指尖加密15.013.613.6…

xml编辑 html_【c# .net】Xml读写操作(XmlTextReader 类)

Xml读写操作(XmlTextReader 类)1.XML简介1)XML 和 HTML 的设计初衷XML 被设计用来传输和存储数据HTML 被设计用来显示数据2)什么是 XML?XML 指可扩展标记语言(EXtensible Markup Language)XML 是一种标记语…

jQ层级选择器

<!DOCTYPE html><html> <head> <meta charset"utf-8" /> <title></title> </head> <body> </body></html> <h1>沁园春雪</h1> <h2>毛***</h2> <div> <span> <d…

spring 获取url参数

1. usl格式&#xff1a; http://localhost:8080/contact/delete/3 java代码 RequestMapping(value"/delete/{id}")public Map<String,Object> delete(PathVariable("id") Integer id){boolean result contactService.deleteContactById(id); 也可以…

leetcode475. 供暖器(二分查找)

冬季已经来临。 你的任务是设计一个有固定加热半径的供暖器向所有房屋供暖。 现在&#xff0c;给出位于一条水平线上的房屋和供暖器的位置&#xff0c;找到可以覆盖所有房屋的最小加热半径。 所以&#xff0c;你的输入将会是房屋和供暖器的位置。你将输出供暖器的最小加热半径…

如何在命令行中使用jq将JSON转换为CSV

by Knut Melvr通过纳特梅尔瓦 如何在命令行中使用jq将JSON转换为CSV (How to transform JSON to CSV using jq in the command line) The shell tool jq is awesome for dealing with JSON-data. It can also transform that data into handy CSV-files, ready for all your s…

macaca运行报错之chrome-driver问题处理,关闭 Chrome 的自动更新

自动更新是 Chrome 非常实用的功能之一&#xff0c;但在有些情况下可能还是有关闭自动更新的需求&#xff0c;比如需要用某一个具体的版本来测试一些东西&#xff0c;或者更新之后反而出现了新的 Bug等等。由于一般人没有这样的需求&#xff0c;所以 Google 没有公布关闭自动更…

docker启动sqlserver_Docker搭建SQLServer

一、下载镜像docker pull microsoft/mssql-server-linux二、启动容器docker-composeversion: 3services:sqlserver:image: microsoft/mssql-server-linux:latestrestart: alwaysprivileged: truecontainer_name: sqlserverports:- 1433:1433volumes:- ./data:/var/opt/mssql/da…

【Python】 子进程创建与使用subprocess

subprocess *****本文参考了Vamei大神的http://www.cnblogs.com/vamei/archive/2012/09/23/2698014.html   运用subprocess包可以在运行python的进程下进一步开启一个子进程&#xff0c;创建子进程要注意 1. 父进程是否暂停 2.创建出的子进程返回了什么 3.执行出错&#xff0c…

异步查询回调函数调用

异步查询数据&#xff0c;需要对返回的数据进行后续步骤操作&#xff0c;使用使用方法&#xff1a; 1、new promise方法使用。 2、回调函数使用 使用方式&#xff1a;   pageGetDeviceTreeInfo({deviceTypeAry:[1]},this.getTreeData); 函数&#xff1a; 1 export function p…

前端开发从项目中获得什么_我如何获得副项目的前10个客户以及从他们那里学到的东西...

前端开发从项目中获得什么by Tigran Hakobyan由Tigran Hakobyan 我如何获得副项目的前10个客户以及从他们那里学到的东西 (How I got my first 10 customers for my side-project and what I’ve learned from them) My name is Tigran, I’m 29, and I’m the creator of Cro…

leetcode278. 第一个错误的版本(二分查找)

你是产品经理&#xff0c;目前正在带领一个团队开发新的产品。不幸的是&#xff0c;你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的&#xff0c;所以错误的版本之后的所有版本都是错的。 假设你有 n 个版本 [1, 2, …, n]&#xff0c;你想找出导致…

lrzsz   linux与windows互传

2019独角兽企业重金招聘Python工程师标准>>> lrzsz linux与windows互传 # 前提是使用 xshell 或者 securecrt 这两个远程软件&#xff0c;putty不支持 yum install -y lrzsz //安装文件包 linux向windows 传文件使用 &#xff1a; sz 文件名 回…

mysql show 命令_mysql show 相关命令

processlist的show方式是不能使用过滤查找&#xff0c;可能源自MySQL的内部安全机制吧&#xff0c;show是用来查看MySQL内部运行数据&#xff0c;其实processlist就是information_schema数据库中的一张表&#xff0c;那么通过查表的方式肯定是可以的了&#xff1a;SELECT user,…

ordereddict有序字典

import collections as con# 有序添加和取字典元素 ord con.OrderedDict() ord[a] 1 ord[b] 2 ord[c] 3 print(ord, ordereddict)# 移动某元素到最后 ord.move_to_end(a) print(ord, move_to_end)转载于:https://www.cnblogs.com/xh4528/p/6538700.html

Spring: (一) -- 春雨润物之 核心IOC

作为一个Java人&#xff0c;想必都或多或少的了解过Spring。对于其优势也能道个一二&#xff0c;诸如方便解耦、支持AOP编程、支持声明式事务、方便测试等等。Spring也不仅仅局限于服务器端开发&#xff0c;它可以做非常多的事情&#xff0c;任何Java应用都可以在简单性、可测试…

reactjs快速如梦_帮助您理解和创建ReactJS应用的快速指南

reactjs快速如梦此帖子分为2部分 (This Post is divided into 2 parts) The First Part demonstrates how to create a simple React app using ‘create-react-app’ CLI and explains the project structure. 第一部分演示了如何使用“ create-react-app” CLI创建简单的Reac…