1
public class TestConcurrent{

 public static void main(String args[]){
    Lock lock = new ReentrantLock();
    boolean b1 = lock.tryLock();
    System.out.println(b1); //prints true       
    boolean b2 = lock.tryLock();
    System.out.println(b2); //prints true again
 }
}

最初にロックしようとすると、オブジェクトが正常にロックされます。2 回目の試行については、オブジェクトがまだロック解除されていないため、2 回目のロック試行は false を返すと思います。しかし、それは再びtrueを返します!!

これに対する説明はありますか?

4

2 に答える 2

2

ReentrantLock.tryLock() Javadocsから引用するには:

現在のスレッドがすでにこのロックを保持している場合、保持カウントが 1 つ増え、メソッドは true を返します。

別のスレッドがロックを試みた場合、それは を返しfalseます。しかし、再びロックしているのは同じスレッドであるため、戻りtrue、保持カウントを 1 つ増やします。これは、unlock()他のスレッドがlock().

これは、ホールド カウントを見ればわかります。

Lock lock = new ReentrantLock();
assertEquals(0, lock.getHoldCount());
boolean b1 = lock.tryLock();
System.out.println(b1); //prints true       
assertEquals(1, lock.getHoldCount());
boolean b2 = lock.tryLock();
System.out.println(b2); //prints true again
assertEquals(2, lock.getHoldCount());
于 2013-09-06T14:33:03.563 に答える
1
  • リスト項目

これは、同じスレッドからロックを 2 回取得しているためです。こちらと同じです

synchronized void x() {
    y();
}

synchronized void y() {
}

スレッドは y でブロックされません

于 2013-09-06T14:35:29.513 に答える