$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
不会改变这种行为。
答案 0 :(得分:0)
文件锁代表整个Java虚拟机保留。它们不适用于控制同一虚拟机中的多个线程对文件的访问。
显示“它们不能用于控制,因为每个JVM只能获得一个锁”。
在此上下文中,“合适的”可能意味着很多事情,包括与基于线程的锁相比效率低下的概念。从多个线程访问文件锁时,必须使用那些保护文件锁。