我没有与 nio 合作太多,并且在发布 FileLock 时遇到了一些麻烦。基本上,在 JVM-A 中,我在一个看起来像这样的文件上有一个不可共享的写锁:
File lockfile = new File("m.lock");
RandomAccessFile writeFile = new RandomAccessFile(lockfile, "rw");
FileChannel writeChannel = writeFile.getChannel();
FileLock writeLock = writeChannel.tryLock(0L, Long.MAX_VALUE, false);
然后在 JVM-B 中,我尝试在同一个文件上创建一个共享读锁,看起来像这样:
File lockfile = new File("m.lock");
RandomAccessFile readFile = new RandomAccessFile(lockfile, "r");
FileChannel readChannel = readFile.getChannel();
FileLock readLock = readChannel.tryLock(0L, Long.MAX_VALUE, true);
while (readLock == null) {
System.out.println("unable to get lock");
Thread.sleep(5000);
readLock = readChannel.tryLock(0L, Long.MAX_VALUE, true);
}
我的问题是 JVM-B 永远循环并且永远不会获得可共享的读锁。即使 JVM-A 存在writeLock.release();
writeChannel.close();
并且writeFile.close();
即使 JVM-A 退出并且不再运行,JVM-B 仍然无法获得文件的可共享读锁。
那么我在这里错过了什么?