2012-03-07 17 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獲取的。

相關問題