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
 }
}

第一次尝试锁定成功地锁定了对象。关于第二次尝试,我认为第二次尝试锁定将返回 false,因为对象尚未解锁。但是它再次返回true!

对此有何解释?

4

2 回答 2

2

引用ReentrantLock.tryLock() Javadocs

如果当前线程已经持有这个锁,那么持有计数加一并且该方法返回真。

如果另一个线程试图做锁,那么它将返回false。但由于再次锁定的是同一个线程,它将返回true并将保持计数加一。这意味着您必须执行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
  • 项目清单

这只是因为您从同一个线程获得了两次锁。这和这里一样

synchronized void x() {
    y();
}

synchronized void y() {
}

线程不会在 y 上阻塞

于 2013-09-06T14:35:29.513 回答