如果仍然抛出OverlappingFileLockException,则在FileChannel.lock中等待的目的是什么?

时间:2018-10-14 08:31:46

标签: java file-locking filechannel filelock

$checkout = WC()->checkout();允许在Java中创建文件锁定(我使用How can I lock a file using java (if possible)FileChannel.lock的方法来避免FileOutputStream):

NonWritableChannelException

使用锁的主要部分,等待持有资源的进程将其释放。因此FileOutputStream out = new FileOutputStream(file); try { java.nio.channels.FileLock lock = out.getChannel().lock(); try { ... } finally { lock.release(); } } finally { out.close(); }

  

将阻塞,直到可以锁定该区域,关闭此通道或中断调用线程(以先到者为准)为止。

但是,每次我尝试锁定同一文件(跨越整个文件的区域)时,都会得到一个lock并被抛出

  

如果该Java虚拟机已经拥有与请求区域重叠的锁,或者该方法已经阻止了另一个线程并试图锁定重叠区域

这与锁定的逻辑矛盾,并且无法使用文件锁定,因为如果只允许队列中有一个线程(其他线程立即抛出OverlappingFileLockException),则必须手动同步资源访问。

OverlappingFileLockException指向lock(0, Long.MAX_VALUE, false)属性的地方使用false不会改变这种行为。

1 个答案:

答案 0 :(得分:0)

  

文件锁代表整个Java虚拟机保留。它们不适用于控制同一虚拟机中的多个线程对文件的访问。

显示“它们不能用于控制,因为每个JVM只能获得一个锁”。

在此上下文中,“合适的”可能意味着很多事情,包括与基于线程的锁相比效率低下的概念。从多个线程访问文件锁时,必须使用那些保护文件锁。