gpt4 book ai didi

java - 如果无论如何都会抛出 OverlappingFileLockException,那么在 FileChannel.lock 中等待的目的是什么?

转载 作者:太空宇宙 更新时间:2023-11-04 10:06:57 25 4
gpt4 key购买 nike

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();
}

处理等待持有资源的进程释放锁的重要部分。因此锁定

will block until the region can be locked, this channel is closed, or the invoking thread is interrupted, whichever comes first.

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

If a lock that overlaps the requested region is already held by this Java virtual machine, or if another thread is already blocked in this method and is attempting to lock an overlapping region

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

使用 lock(0, Long.MAX_VALUE, false)(其中 false 指的是 shared 属性)不会改变此行为。

最佳答案

File locks are held on behalf of the entire Java virtual machine. They are not suitable for controlling access to a file by multiple threads within the same virtual machine.

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

“合适”在这种情况下可能意味着很多事情,包括与基于线程的锁相比效率低下的概念。当从多个线程访问文件时,必须使用它们来保护文件锁。

关于java - 如果无论如何都会抛出 OverlappingFileLockException,那么在 FileChannel.lock 中等待的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52800881/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com