我没有和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中我尝试在同一个文件上创建一个SHARABLE读锁定,如下所示:
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永远循环,永远不会获得SHARABLE读锁定。即使JVM-A执行writeLock.release();
writeChannel.close();
和writeFile.close();
,即使JVM-A退出并且不再运行,JVM-B仍然无法获得SHARABLE读锁定文件。
那我在这里错过了什么?
答案 0 :(得分:0)
我的错误是每个人,我发现了我的错误。我的代码看起来像这样:
readChannel.tryLock(0L, Long.MAX_VALUE, true);
而不是:
readLock = readChannel.tryLock(0L, Long.MAX_VALUE, true);
我错过了变量赋值。