2012-03-07 34 views
3

我注意到下面的代码块:关于多重锁定尝试,使用java.concurrent.ReentrantLock

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

任何inisghts在这里?

+3

您是否阅读过ReentrantLock的文档? http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/locks/ReentrantLock.html – 2012-03-07 22:07:30

+3

线索的名称是:reentrant – 2012-03-07 22:10:31

+0

所有锁都是在同一个线程中获取的所以它是正确的。这是ReentrantLock的设计。当你尝试在另一个线程中锁定时,它将为假 – 2013-02-10 05:46:43

回答

6

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

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

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

10

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

来源:ReentrantLock.lock()

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

5

ReentrantLock特别设计为使得在同一线程可以获得锁不止一次。这就是“可重入”的意思。这是为了从一开始就展现出这种行为。

+0

真正的“可重入”意味着线程安全或更具体地说可以重新输入。 http://en.wikipedia.org/wiki/Reentrancy_(computing) – Gray 2012-03-07 22:26:28

+0

http://en.wikipedia.org/wiki/Reentrant_mutex“在计算机科学中,可重入互斥体是一种互斥,递归锁机制。在一个可重入互斥锁,同一个线程可以多次获取锁。“ – 2012-03-07 22:27:41

+0

这是“Reentrant_mutex”的定义。我只是在评论“重入”这个词与多次获得锁的线程无关。 – Gray 2012-03-07 22:30:53

0

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

相关问题