2016-04-24 84 views
3

在Java中,我們可以按照如下用鎖接口和ReentrantLock類實現公平這是等待大多數持續時間被授予訪問鎖定。的Java Multihreading同步與鎖

任何人都可以提供詳細的如何JVM保持長時間等待線程的軌道,即JVM如何實現公平。

+1

*一個公平的鎖是線程獲得鎖的順序,他們要求它的順序* - ReentrantLock不會使用隊列嗎?我看了一下源代碼,'ReentrantLock'有兩個靜態類,它們擴展了'AbstractQueuedSynchronizer',在類上公平而另一個不公平。 –

+1

@JonnyHenly正如你所說,它使用一個隊列作爲源代表。沒有魔法在繼續。 +1 –

+1

@PeterLawrey Woohoo!我喜歡沒錯。 –

回答

1

詳細信息在源代碼中。

  • 「java.util.concurrent.locks.ReentrantLock中源」
  • 「java.util.concurrent.locks.AbstractQueuedSynchronizer中源」

:和源代碼可以通過谷歌搜索可以找到代碼格外好評。

簡短的回答是,每個鎖都有一個等待線程隊列,它被實現爲一個鏈表。

  • 在「公平」情況下,嘗試在隊列非空時獲取鎖的線程被添加到隊列末尾。

  • 在「不公平」的情況下,如果鎖定當前是空閒的,則線程可以插入。這可以提供更好的性能,因爲您不需要執行需要系統調用的線程上下文切換。