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
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战