如果 OverlappingFileLockException 仍然抛出,在 FileChannel.lock 中等待的目的是啥?
Posted
技术标签:
【中文标题】如果 OverlappingFileLockException 仍然抛出,在 FileChannel.lock 中等待的目的是啥?【英文标题】:What's the purpose of waiting in FileChannel.lock if OverlappingFileLockException is thrown anyway?如果 OverlappingFileLockException 仍然抛出,在 FileChannel.lock 中等待的目的是什么? 【发布时间】:2019-03-18 22:41:41 【问题描述】:FileChannel.lock
允许在 Java 中创建文件锁(我使用How can I lock a file using java (if possible) 和FileOutputStream
的方法以避免NonWritableChannelException
):
FileOutputStream out = new FileOutputStream(file);
try
java.nio.channels.FileLock lock = out.getChannel().lock();
try
...
finally
lock.release();
finally
out.close();
处理锁等待由持有资源的进程释放的重要部分。所以lock
将阻塞,直到该区域可以被锁定、该通道被关闭或调用线程被中断,以先到者为准。
但是,每次我尝试锁定同一个文件(跨越整个文件的区域)时,我都会得到一个 OverlappingFileLockException
,它会被抛出
如果此 Java 虚拟机已持有与请求区域重叠的锁,或者如果另一个线程已在此方法中阻塞并正在尝试锁定重叠区域
这与锁定的逻辑相矛盾,并且无法使用文件锁定,因为如果队列中只允许一个线程(更多线程立即抛出OverlappingFileLockException
),则必须手动同步资源访问。
使用lock(0, Long.MAX_VALUE, false)
,其中false
指的是shared
属性不会改变这种行为。
【问题讨论】:
【参考方案1】:代表整个 Java 虚拟机持有文件锁。它们不适用于控制同一虚拟机内的多个线程对文件的访问。
读取“它们不能用于控制,因为每个 JVM 只能获取一个锁”。
“合适”在这种情况下可能意味着很多事情,包括与基于线程的锁相比效率低下的概念。当从多个线程访问文件时,必须使用它们来保护文件锁。
【讨论】:
当您调用filechannel.lock(start, end, true_or_false)
时,该区域是否可以被操作系统换出?或者说和系统调用mlock一样吗?以上是关于如果 OverlappingFileLockException 仍然抛出,在 FileChannel.lock 中等待的目的是啥?的主要内容,如果未能解决你的问题,请参考以下文章