FileLock

概述

1、文件锁是进程级别的,不是线程级别的

2、文件锁可以解决多个进程并发访问、修改同一个文件的问题,但不能解决多线程并发访问、修改同一文件的问题

3、使用文件锁时,同一进程内的多个线程,可以同时访问、修改此文件

4、文件锁是当前程序所属的 JVM 实例持有的,一旦获取到文件锁(对文件加锁),要调用 release(),或者关闭对应的 FileChannel 对象,或者当前 JVM 退出,才会释放这个锁

5、一旦某个进程(比如 JVM 实例)对某个文件加锁,则在释放这个锁之前,此进程不能再对此文件加锁,就是说 JVM 实例在同一文件上的文件锁不是可重入锁(进程级别不能重复在同一文件上获取锁)

6、文件锁分类

(1)排它锁 / 独占锁:对文件加排它锁后,该进程可以对此文件进行读写,该进程独占此文件,其他进程不能读写此文件,直到该进程释放文件锁

(2)共享锁:某个进程对文件加共享锁,其他进程也可以访问此文件,但这些进程都只能读此文件,不能写,线程是安全的,只要还有一个进程持有共享锁,此文件就只能读,不能写

7、在某些 OS 上,对某个文件加锁后,不能对此文件使用通道映射

 

FileChannel 获取 FileLock

1、获取此通道文件的排他锁

public final FileLock lock() throws IOException

 

(1)调用此方法的形式为 fc.lock() 的行为方式与调用 fc.lock(0L, Long.MAX_VALUE, false) 完全相同

2、获取此通道文件的给定区域的锁

public abstract FileLock lock(long position,
                              long size,
                              boolean shared)
                       throws IOException

(1)此方法的调用将阻塞,直到该区域被锁定,此通道关闭或调用的线程被中断(以先到者为准)

(2)如果此通道在调用此方法期间由另一个线程关闭,则将抛出 AsynchronousCloseException

(3)如果在等待获取锁定的情况下调用线程中断,则其中断状态将被设置,并且将抛出一个 FileLockInterruptionException,如果在调用此方法时调用了调用者的中断状态,那么将立即抛出该异常,线程的中断状态不会改变

(4)由 position 和 size 参数指定的区域,不需要包含在实际的底层文件内,甚至与实际的底层文件重叠,锁定区域的大小固定,如果锁定区域最初包含文件的结尾,并且文件增长超出该区域,那么该文件的新部分将不会被该锁覆盖,如果文件的大小增加,并且整个文件都需要锁定,则应该锁定从零开始并且不小于文件的预期最大大小的区域,零参数 lock() 方法简单地锁定一个大小为 Long.MAX_VALUE 的区域

(5)某些操作系统不支持共享锁,在这种情况下,共享锁的请求将自动转换为独占锁的请求,新获取的锁是共享的还是独占的可以通过调用生成的锁定对象的 isShared 方法来测试

(6)文件锁代表整个 JVM,它们不适用于通过同一虚拟机中的多个线程来控制对文件的访问

(7)position:锁定区域要启动的位置,必须是非负的

(8)size:锁定区域的大小,必须是非负数,并且 position + size 之和必须是非负数

(9)shared:true,请求共享锁,在这种情况下,该通道必须打开才能读取(可能写入);false,要求一个独占锁,在这种情况下,这个通道必须是开放的写(和可能阅读)

3、尝试获取此频道文件的排他锁

public final FileLock tryLock() throws IOException

(1)调用此方法的形式为 fc.tryLock() 的行为方式,与调用 fc.tryLock(0L, Long.MAX_VALUE, false) 完全相同结果

(2)如果由于另一个程序保持重叠锁定而无法获取锁, 则为 null

4、尝试获取此通道文件的给定区域的锁

public abstract FileLock tryLock(long position,
                                 long size,
                                 boolean shared)
                          throws IOException

(1)此方法不阻塞

(2)调用总是立即返回,要么获取了请求的区域的锁定,要么没有,如果由于重叠的锁被另一个程序持有而无法获取锁,则返回 null,如果由于任何其他原因无法获取锁,则抛出适当的异常

(3)由 position 和 size 参数指定的区域不需要包含在实际的底层文件内,甚至与实际的底层文件重叠,锁定区域的大小固定,如果锁定区域最初包含文件的结尾,并且文件增长超出该区域,那么该文件的新部分将不会被该锁覆盖,如果文件的大小增加,并且整个文件都需要锁定,则应该锁定从零开始并且不小于文件的预期最大大小的区域,零参数 tryLock() 方法简单地锁定一个大小为 Long.MAX_VALUE 的区域

(4)某些操作系统不支持共享锁,在这种情况下,共享锁的请求将自动转换为独占锁的请求,新获取的锁是共享的还是独占的都可以通过调用生成的锁定对象的 isShared 方法进行测试

(5)文件锁代表整个 JVM,它们不适用于通过同一虚拟机中的多个线程来控制对文件的访问

(6)position:锁定区域要启动的位置,必须是非负的

(7)size:锁定区域的大小,必须是非负数,并且 position + size 之和必须是非负数

(8)shared:true 要求共享锁;false,要求排他锁

(9)如果由于另一个程序保持重叠锁定而无法获取锁, 则为 null

 

告诉这个锁是否有效

public abstract boolean isValid()

 

1、锁定对象在释放之前保持有效,或关联的文件通道关闭,以先到者为准

2、如果锁有效,返回 true

 

告诉这个锁是否共享

public final boolean isShared()

1、如果锁是共享的,返回 true

2、如果锁是排他的,返回 false

posted @   半条咸鱼  阅读(151)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示