2012-02-11 61 views

回答

4

按照Java documentation for notify()

喚醒在此對象監視器上等待的單個線程。如果 任何線程正在等待這個對象,其中一個被選中爲 被喚醒。 該選項是任意的,並且由 實施決定。線程通過調用等待方法的一個 來等待對象的顯示器。

所以如果你使用synchronized(obj){}你基本上無法控制哪個線程將獲得obj鎖,你不能做任何假設。這取決於調度程序。

如果你想公平(即下一個獲得鎖的線程是隊列中的第一個),看看ReentrantLock:它有一個布爾型標誌來指定你想強制公平。

+0

謝謝。另外,似乎同步(obj)塊也會調用wait(),您能否概述在同步塊或方法之前,期間和之後執行的操作鏈: – itsraja 2012-02-11 17:31:52

+0

您是什麼意思?該算法用於確保在一段代碼上相互排斥?或者調度算法? 對於前者,從概念上講,您可能需要查看Peterson的算法:https://en.wikipedia.org/wiki/Peterson's_algorithm。 對於後者,它在這裏討論:http://stackoverflow.com/questions/2816011/what-is-the-jvm-scheduling-algorithm – 2012-02-11 18:44:41

+0

謝謝。我的意思是在Java的方法上互斥。像wait(),notify()...我會很高興看到這些函數調用的序列模擬2線程試圖1對象。嘿,這類似於2個(或更多)男孩提出1個女孩。他們稱之爲婚姻;) – itsraja 2012-02-12 03:23:44

0

根據Java Oracle Docs

這個類的構造函數接受一個可選的公平性參數。當設置爲true時,在爭用中,鎖有利於授予對最長等待線程的訪問權限。否則,該鎖不保證任何特定的訪問順序。

如果您允許公平,那麼將使用FIFO(先進先出),否則它看起來是隨機的(從我的觀察中)。

+0

你假設他使用ReentrantLock ...他只說「線程競爭鎖定在同一個對象上」,這可能是任何對象恕我直言 – 2012-02-11 15:17:54

相關問題