猿问

如果仍然抛出 OverlappingFileLockException

FileChannel.lock允许在 Java 中创建文件锁(我使用How can I lock a file using java (if possible) withFileOutputStream以避免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 虚拟机持有,或者另一个线程已在此方法中被阻塞并正在尝试锁定重叠区域


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


使用lock(0, Long.MAX_VALUE, false)wherefalse引用shared属性不会改变这种行为。


慕码人2483693
浏览 394回答 1
1回答

慕丝7291255

代表整个 Java 虚拟机持有文件锁。它们不适合控制同一虚拟机内的多个线程对文件的访问。读取“它们不能用于控制,因为每个 JVM 只能获取一个锁”。在这种情况下,“合适”可能意味着很多东西,包括与基于线程的锁相比效率低下的概念。当从多个线程访问文件时,必须使用它们来保护文件锁。
随时随地看视频慕课网APP

相关分类

Java
我要回答