4

我注意到以下代码块:

    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

4 回答 4

11

Javadoc 是您的朋友。你真的应该读它。

来自:ReentrantLock.lock()

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

于 2012-03-07T22:08:09.947 回答
6

我敢打赌,您会一遍又一遍地从同一个线程中锁定它。在这种情况下,线程已经拥有锁,所以锁被成功获取(因为它甚至不必被获取)。

ReentrantLock 由上次成功锁定但尚未解锁的线程拥有。当锁不被另一个线程拥有时,调用锁的线程将返回,成功获取锁。如果当前线程已经拥有锁,该方法将立即返回。这可以使用方法 isHeldByCurrentThread() 和 getHoldCount() 来检查。

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/locks/ReentrantLock.html

于 2012-03-07T22:07:19.487 回答
5

ReentrantLock专门设计的,以便同一个线程可以多次获得锁。这就是“可重入”的意思。它旨在从一开始就表现出这种行为。

于 2012-03-07T22:09:25.490 回答
0

它总是返回 true,因为只有一个线程,如果thread1找到s.lock()s.tryLock()它只会增加保持计数,如果另一个线程将尝试执行此代码,则方法s.tryLock( )将返回 false,因为锁是由thread1获取的。

于 2017-02-23T04:21:03.233 回答