當兩個線程試圖獲取同一個對象的鎖時,被認爲決定鎖應該交給哪個線程的東西是什麼。什麼決定了兩個競爭線程中的哪一個獲取鎖?
5
A
回答
4
按照Java documentation for notify():
喚醒在此對象監視器上等待的單個線程。如果 任何線程正在等待這個對象,其中一個被選中爲 被喚醒。 該選項是任意的,並且由 實施決定。線程通過調用等待方法的一個 來等待對象的顯示器。
所以如果你使用synchronized(obj){}
你基本上無法控制哪個線程將獲得obj
鎖,你不能做任何假設。這取決於調度程序。
如果你想公平(即下一個獲得鎖的線程是隊列中的第一個),看看ReentrantLock:它有一個布爾型標誌來指定你想強制公平。
0
這個類的構造函數接受一個可選的公平性參數。當設置爲true時,在爭用中,鎖有利於授予對最長等待線程的訪問權限。否則,該鎖不保證任何特定的訪問順序。
如果您允許公平,那麼將使用FIFO(先進先出),否則它看起來是隨機的(從我的觀察中)。
+0
你假設他使用ReentrantLock ...他只說「線程競爭鎖定在同一個對象上」,這可能是任何對象恕我直言 – 2012-02-11 15:17:54
相關問題
- 1. 什麼的線程競爭infulence?
- 2. 爲什麼增加線程競爭聯鎖速度較慢?
- 3. 哪個線程獲取鎖定哪個對象?
- 4. 什麼是競爭?
- 5. 獲取鎖定/釋放鎖定,以PHP解決競速條件
- 6. 線程競爭條件
- 7. 競爭條件C線程
- 8. 爲什麼在這個程序中有競爭條件?
- 9. 同步方法override-線程獲取鎖定哪個對象?
- 10. 競爭編程:解決方案運行慢了一點
- 11. 多線程(並行線程)競爭碼
- 12. Memcached,鎖定和競爭條件
- 13. cque任務線程與競爭競爭條件
- 14. 我是否在兩個線程中都鎖定了代碼?
- 15. 瞭解爲什麼競爭情況發生在只有一個線程執行寫入操作時
- 16. 什麼決定了一個進程在內存中的結構?
- 17. 如何讓一個線程解鎖另一個線程鎖定的互斥鎖?
- 18. 如何避免獲取互斥鎖時的競爭狀態?
- 19. 當第一個線程鎖定類時第二個線程會發生什麼
- 20. QMutex鎖定在一個線程中,並在另一個線程中解鎖
- 21. 哪個更好,原子之間的競爭:單個Warp的線程還是不同的Warps線程?
- 22. 線程競賽和鎖定關鍵字
- 23. 一個簡單的Java競爭條件
- 24. 什麼是這種稱爲競爭條件的解決方案?
- 25. 爲什麼在這個java代碼中沒有競爭條件?
- 26. 在C++ 11中傳遞指向另一個線程的指針時,競爭條件是什麼?
- 27. 獲取對兩個互斥鎖的鎖定並避免死鎖
- 28. 兩個Autofac容器在單個webrequest中競爭
- 29. Java多線程競爭條件場景
- 30. Helgrind報告單線程數據競爭
謝謝。另外,似乎同步(obj)塊也會調用wait(),您能否概述在同步塊或方法之前,期間和之後執行的操作鏈: – itsraja 2012-02-11 17:31:52
您是什麼意思?該算法用於確保在一段代碼上相互排斥?或者調度算法? 對於前者,從概念上講,您可能需要查看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
謝謝。我的意思是在Java的方法上互斥。像wait(),notify()...我會很高興看到這些函數調用的序列模擬2線程試圖1對象。嘿,這類似於2個(或更多)男孩提出1個女孩。他們稱之爲婚姻;) – itsraja 2012-02-12 03:23:44