[英]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.