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属性不会改变这种行为。
慕丝7291255
相关分类