2016-06-21 4 views
1

ロック解除された場合でも、ロック取得に失敗しました:ReentrantReadWriteLockは、その状態が、私は次のコードを使用してスレッドのロックを取得しようとしています

com.concurrent.TryLockTimeoutException: keyIp : Failed to acquire [email protected]2cee[Unlocked] within 30MINUTES 
    at com.concurrent.NeAccessLockMap.acquireReadOrWriteLock(NeAccessLockMap.java:72) 

ロック状態は[Unlocked in error]として表示されます。

なぜこれが起こるのか理解できません。ロックが解放されていても、スレッドがロックを取得できない理由

+1

はロックされ、読み取りロックはありますか? – tkausl

+0

読み取り/書き込みロックの両方をチェックしませんか? – Batty

+0

私は確信していませんが、私はそうは思わない。なぜ、実際にはロックされている読み取りロックで、書き込みロックではないのに、書き込みロックに 'Locked'と表示されるのですか? – tkausl

答えて

2

例では、書き込みロックを取得しようとしましたが、読み取りロックが既にロックされているため、書き込みロックを取得できません。

1つまたは複数の読み取りロックを取得することも、1つの書き込みロックを取得することもできるため、読み取りロックが取得されたときに書き込みロックはUnlockedとマークされます。

次のコードを試してみてください。

ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock(); 
new Thread() { 
    @Override 
    public void run() { 
     readWriteLock.readLock().lock(); 
     try { 
      // block the read lock 
      Thread.sleep(5000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
}.start(); 
if (!readWriteLock.writeLock().tryLock(1, TimeUnit.SECONDS)) { 
    System.out.println(readWriteLock); 
    System.out.println(readWriteLock.readLock()); 
    System.out.println(readWriteLock.writeLock()); 
} 

は次のように出力を持っているでしょう:

[email protected][Write locks = 0, Read locks = 1] 
[email protected]a04[Read locks = 1] 
[email protected]38a9[Unlocked] 
関連する問題