我注意到以下代码块:
final Lock s = new ReentrantLock();
for(int i = 0 ; i < 1000 ; i++)
{
s.lock();
System.out.println(i+" :" +s.tryLock()+" ");
}
打印:
0 :true
1 :true
2 :true
3 :true
...
这很奇怪 - 我希望连续的锁失败,因为s永远不会被解锁。
这里有什么问题吗?
答案 0 :(得分:10)
答案 1 :(得分:6)
我打赌你是从同一个帖子一遍又一遍地锁定它。在这种情况下,线程已经拥有锁,因此成功获取锁(因为甚至不必获取锁)。
ReentrantLock由最后成功锁定的线程拥有,但尚未解锁。当锁不是由另一个线程拥有时,线程调用锁将返回,成功获取锁。如果当前线程已拥有锁,则该方法将立即返回。这可以使用方法isHeldByCurrentThread()和getHoldCount()进行检查。
http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/locks/ReentrantLock.html
答案 2 :(得分:5)
ReentrantLock
具体设计,以便同一个线程可以多次获取锁定。这是什么&#34; reentrant&#34;手段。它意味着从一开始就表现出这种行为。
答案 3 :(得分:0)
它总是返回true,因为只有一个线程,如果 thread1 找到 s.lock()或 s.tryLock()它只会递增保持计数,如果另一个线程尝试执行此代码,方法 s.tryLock()将返回false,因为锁定是由 thread1 获取的。