繁体   English   中英

Java并发尝试锁定

[英]Java concurrency try to 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
 }
}

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

有什么解释吗?

引用ReentrantLock.tryLock()Javadocs

如果当前线程已经持有此锁,则持有计数将增加一,并且该方法返回true。

如果另一个线程试图进行锁定,则它将返回false 但是,由于是同一线程再次被锁定,因此它将返回true ,并将保持计数加1。 这意味着在其他线程获得lock()之前,您必须两次对其进行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());
  • 项目清单

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

synchronized void x() {
    y();
}

synchronized void y() {
}

线程不会在y上阻塞

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM