文件加锁(基于FileChannel)

摘要:
JDK1.4引入了文件锁定机制。它允许我们作为共享资源同步访问文件。两个线程争夺同一个文件可能位于不同的Java虚拟机上,文件锁定对其他操作系统进程可见,因为Java文件锁定直接映射到本地操作系统的挂钩工具。或者,调用lock()的线程中断(即,它首先挂断),或者调用lock()的通道关闭。使用FileLock。release()以释放锁。

      JDK1.4引入了文件加锁机制。它允许我们同步访问某个作为共享资源的文件。不过,竞争同一文件的两个线程可能在不同的Java虚拟机上,或者一个是Java线程,另一个是操作系统中的其他的某个本地线程。文件加锁对其他的操作系统进程是可见的,因为Java的文件加锁直接映射到了本地操作系统的枷锁工具。

      通过对FileChannel调用tryLock()或者lock(),就可以获得整个文件的FileLock。其中tryLock()是非阻塞式的,它设法获得锁,如果不能获得(其他的一些进程已经持有相同的锁,并且不共享),它将直接从方法调用返回。lock()则是阻塞式的,它要阻塞进程直至锁可以获得,或者调用lock()的线程中断(就是自己先挂掉了),或调用lock()的通道关闭。使用FileLock.release()可以释放锁。

FileOutputStream fos = new FileOutputStream(new File("lock.tct"));
FileLock fl = fos.getChannel().tryLock();
if(fl!=null) {
    XXXX//各种文件操作
    fl.release(); //释放锁
}
fos.close();

       也可以通过如下方法对文件的一部分上锁

 tryLock(long pos , long size , boolean shared) 
 lock(long pos , long size , boolean shared) 
//加锁的区域由size-position决定。第三个参数指定是否是共享锁

        无参数的加锁方法将根据文件尺寸的变化而变化,而固定尺寸的锁不随文件尺寸的变化而变化。如果你在某一区域上加锁了,那么当文件增大的时候,加锁区域还是那个区域,多出的区域不会被锁定。而无参数的时候,是对整个文件进行加锁,文件变大后,也是对整个文件进行加锁。

免责声明:文章转载自《文件加锁(基于FileChannel)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇selenium元素定位之多个元素中选择其中的一个捕获异常 .下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Linux系统下查找最近修改过的文件

Linux的终端上,没有windows的搜索那样好用的图形界面工具,但find命令确是很强大的。 比如按名字查找一个文件,可以用 find / -name targetfilename 。 唉,如果只知道名字,不知道地点,这样也不失为一个野蛮有效的方法。 按时间查找也有参数 -atime 访问时间 -ctime 改变状态的时间 -mtime修改的时间。但...

Java Web 面试中关于Spring MVC必问题,不看血亏!

前言 Spring MVC是Spring构建在Servlet API上的Web框架。目前大部分的Java Web 开发已经使用Spring MVC 来做。它提供了模型 - 视图 - 控制器架构,可用于开发灵活的Web应用程序。在本教程中,我们将重点关注与之相关的问题,因为它通常是Spring开发人员面试的主题。 为什么选择Spring MVC Spring...

对文件内容就行修改-java代码

在实际的生产中,会遇到数据库版本的不同,sql语句的语法会出现改变, 我在这次的金仓数据库中就遇到了,V8版本的建表语句跟V7版本的不一样,所以需要对里面内容进行修改  从图中我们可以看到到,这个是金仓数据库v8版本导出的建表语句,这个语句在v7版本是不能运行的 我们需要做的就是 在这分享一小段java代码,本人是个菜鸟,大家看到写得不好也请见谅! 首...

git add --all 为啥不能添加空文件夹,这样设计的初衷是

git add --all 为啥不能添加空文件夹,这样设计的初衷是? 好多项目还得弄个假文件在空文件夹里面占位 这个算设计失误吧,见 https://git.wiki.kernel.org/index.php/GitFaq#Can_I_add_empty_directories.3FCurrently the design of the git inde...

2020第44周Windows文件系统不区分大小写

由于Windows文件系统不区分大小写,所以你不能通过大小写来区分文件名或文件夹名,比如你在资源管理器中新建一个A.txt文件,想再建个a.txt时会提示你重名并自动重命名。这在Git操作时可能会遇到问题,比如你代码库里文件或文件夹修改了名称,默认Git认为是没变的,如果单纯让Git在仓库中区分大小写会产生两份文件并且无法在Windows系统中观察到),...

python3.6+pycharm+robotframework 环境搭建

参考文档:https://www.cnblogs.com/chenyuebai/p/8359577.html, https://www.cnblogs.com/jiyanjiao-702521/p/9235724.html, https://blog.csdn.net/weixin_33829657/article/details/86128739 安装配...