Java并发性尝试锁定

Java并发性尝试锁定,java,concurrency,locking,Java,Concurrency,Locking,第一次尝试锁定会成功锁定对象。 关于第二次尝试,我假设第二次尝试锁定将返回false,因为对象尚未解锁。然而,它再次返回真的 对此有何解释?引自: 如果当前线程已经持有该锁,那么持有计数将增加1,并且该方法返回true 如果另一个线程尝试执行锁定,那么它将返回false。但是,由于再次锁定的是同一个线程,因此它将返回true,并将保持计数增加1。这意味着您必须在其他线程获得lock()之前将其解锁两次 您可以通过查看保留计数来了解这一点: public class TestConcurrent{

第一次尝试锁定会成功锁定对象。 关于第二次尝试,我假设第二次尝试锁定将返回false,因为对象尚未解锁。然而,它再次返回真的

对此有何解释?

引自:

如果当前线程已经持有该锁,那么持有计数将增加1,并且该方法返回true

如果另一个线程尝试执行锁定,那么它将返回
false
。但是,由于再次锁定的是同一个线程,因此它将返回
true
,并将保持计数增加1。这意味着您必须在其他线程获得
lock()
之前将其解锁两次

您可以通过查看保留计数来了解这一点:

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
 }
}
  • 列表项
这只是因为您从同一个线程获得了两次锁。这和这里一样

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());

线程不会阻塞y

阅读锁的工作原理(在单线程范围内)。谢谢。我只是阅读了接口锁的javadoc,而不是实现类。现在它有意义了
synchronized void x() {
    y();
}

synchronized void y() {
}