此問題受this other question啓發。Java:等待同步塊,誰先到?
如果一個塊上有多個線程正在等待,並且鎖定變爲可用,那麼誰先走?線程是否優先(然後先到先得)?
並做相同的規則適用於notify
(與多個wait
ing線程)?
此問題受this other question啓發。Java:等待同步塊,誰先到?
如果一個塊上有多個線程正在等待,並且鎖定變爲可用,那麼誰先走?線程是否優先(然後先到先得)?
並做相同的規則適用於notify
(與多個wait
ing線程)?
根據這個傢伙:http://tutorials.jenkov.com/java-concurrency/starvation-and-fairness.html
的Java發出關於順序沒有保證。所以我猜這不是基於線程優先
我會試着進一步尋找關於Java如何決定誰先行的決定。
關於第二個問題
其中的一個選擇被喚醒。這種選擇是任意的,並且由實施決定。線程通過調用其中一個等待方法來等待對象的監視器。
從http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Object.html#notify()
其他人提到了公平鎖的可用性。如果你真的關心誰先走,那麼你可能有一個實時問題。在這種情況下,您可以使用RTSJ,其中指定了鎖獲取的排序和其他語義。具體細節可在RTSJ Spec下同步。從基本原理部分報價:
Java對同步碼 規則規定互斥 的一種手段,但並不妨礙極大優先級 倒置,因此對於實時應用不足 。本 規範通過提供優先級繼承和優先 天花板仿真類 加強由 強制優先級反轉控制, 特別是 語義同步代碼。優先 繼承在實時操作系統中更廣泛地實現 ,因此是必需的,並且是此 規範中的初始 默認機制。
如果您正在尋找'公平鎖',請查看java.util.concurrent包。舉個例子,ReEntrantLocks是公平的。公平性來自優先考慮等待時間最長的線程,類似於進程調度中的「老化」概念。 – questzen 2010-10-15 08:04:57