0

私は nio をあまり使ったことがなく、FileLock の解放に問題があります。基本的に、JVM-A では、次のようなファイルに NON-SHARABLE 書き込みロックがあります。

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 読み取りロックを取得できません。

それで、私はここで何が欠けていますか?

4

1 に答える 1

0

私の間違い、みんな、私は自分の間違いを見つけました。私のコードは次のようになりました:

readChannel.tryLock(0L, Long.MAX_VALUE, true);

これの代わりに:

readLock = readChannel.tryLock(0L, Long.MAX_VALUE, true);

変数の割り当てを見逃しました。

于 2012-11-15T20:03:55.943 に答える