2010-10-15 61 views
10

此問題受this other question啓發。Java:等待同步塊,誰先到?

如果一個​​塊上有多個線程正在等待,並且鎖定變爲可用,那麼誰先走?線程是否優先(然後先到先得)?

並做相同的規則適用於notify(與多個wait ing線程)?

+1

如果您正在尋找'公平鎖',請查看java.util.concurrent包。舉個例子,ReEntrantLocks是公平的。公平性來自優先考慮等待時間最長的線程,類似於進程調度中的「老化」概念。 – questzen 2010-10-15 08:04:57

回答

7

根據這個傢伙:http://tutorials.jenkov.com/java-concurrency/starvation-and-fairness.html

的Java發出關於順序沒有保證。所以我猜這不是基於線程優先

我會試着進一步尋找關於Java如何決定誰先行的決定。

+2

+1有趣。原來,併發包中的鎖具有可選的公平模式,在這種情況下,它們工作在fifo。如果不是,那是任意的。我會認爲線程優先級應該在這裏起作用。 – Thilo 2010-10-15 07:22:56

+0

我同意這將是「自然」的選擇。 – 2010-10-15 07:39:04

+2

公平性是以犧牲成本爲代價的,可預測性是以犧牲吞吐量下降爲代價來實現的。此外,公平性要求將阻止虛擬機在實現鎖定採集(如細旋轉鎖等)方面進行的大量優化。 – sjlee 2010-10-15 14:31:07

1

關於第二個問題

其中的一個選擇被喚醒。這種選擇是任意的,並且由實施決定。線程通過調用其中一個等待方法來等待對象的監視器。

http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Object.html#notify()

+0

任何想法如何熱點處理這個? – Thilo 2010-10-15 07:18:34

+0

如果我將這兩個答案與線程優先級一起考慮,而不會導致Linux上的操作系統線程優先級(至少在大多數情況下),那麼這些優先級看起來似乎沒有太多... – Thilo 2010-10-15 07:30:39

+0

@Thilo它取決於實施。我不能說這是依賴於操作系統。 – 2010-10-15 07:32:47

0

它依賴於線程優先級和線程調度算法,並且同步塊的鎖定也不是「公平的」。這意味着如果有兩個等待的線程具有相同的優先級並且第一個線程比第二個線程等待更多,這並不一定意味着第一個線程將首先執行。

+0

您是否說優先級更高? – Thilo 2010-10-15 07:49:20

+0

對不起,我不是這樣說的,我錯過了那個案子。我說的是,即使是具有更高優先級的線程也可以在公平性較低的線程之後執行。這是因爲不公平的鎖提供較弱的活性保證,要求所有線程最終獲得鎖。 – punkers 2010-10-15 08:06:12

4

其他人提到了公平鎖的可用性。如果你真的關心誰先走,那麼你可能有一個實時問題。在這種情況下,您可以使用RTSJ,其中指定了鎖獲取的排序和其他語義。具體細節可在RTSJ Spec同步。從基本原理部分報價:

Java對同步碼 規則規定互斥 的一種手段,但並不妨礙極大優先級 倒置,因此對於實時應用不足 。本 規範通過提供優先級繼承和優先 天花板仿真類 加強由 強制優先級反轉控制, 特別是 語義同步代碼。優先 繼承在實時操作系統中更廣泛地實現 ,因此是必需的,並且是此 規範中的初始 默認機制。