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属性不会改变这种行为。
1 回答
慕丝7291255
TA贡献1859条经验 获得超6个赞
代表整个 Java 虚拟机持有文件锁。它们不适合控制同一虚拟机内的多个线程对文件的访问。
读取“它们不能用于控制,因为每个 JVM 只能获取一个锁”。
在这种情况下,“合适”可能意味着很多东西,包括与基于线程的锁相比效率低下的概念。当从多个线程访问文件时,必须使用它们来保护文件锁。
添加回答
举报
0/150
提交
取消