关于多次锁定尝试,使用java.concurrent.ReentrantLock

时间:2012-03-07 22:04:46

标签: java multithreading locking reentrancy

我注意到以下代码块:

    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永远不会被解锁。

这里有什么问题吗?

4 个答案:

答案 0 :(得分:10)

Javadoc is your friend。你真的应该读它。

发件人:ReentrantLock.lock()

  

如果当前线程已经保持锁定,则保持计数加1,方法立即返回。

答案 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 获取的。