當兩個線程試圖獲取同一個對象的鎖時,被認爲決定鎖應該交給哪個線程的東西是什麼。什麼決定了兩個競爭線程中的哪一個獲取鎖?
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. 競爭條件C線程
- 4. 競爭編程:解決方案運行慢了一點
- 5. 同步方法override-線程獲取鎖定哪個對象?
- 6. Memcached,鎖定和競爭條件
- 7. 瞭解爲什麼競爭情況發生在只有一個線程執行寫入操作時
- 8. 什麼決定了一個進程在內存中的結構?
- 9. 如何避免獲取互斥鎖時的競爭狀態?
- 10. 哪個更好,原子之間的競爭:單個Warp的線程還是不同的Warps線程?
- 11. 一個簡單的Java競爭條件
- 12. 什麼是這種稱爲競爭條件的解決方案?
- 13. 爲什麼在這個java代碼中沒有競爭條件?
- 14. 獲取對兩個互斥鎖的鎖定並避免死鎖
- 15. 兩個Autofac容器在單個webrequest中競爭
- 16. Java多線程競爭條件場景
- 17. $。每個.getJSON競爭條件?
- 18. 爲什麼QThread只打印兩個線程中的一個?
- 19. 爲什麼Thread.interrupt()不能中斷試圖獲取鎖的線程
- 20. 尋找一個下劃線包裝,以避免競爭條件
- 21. 什麼決定了哪個索引`pip`要使用?
- 22. 變量集&獲取,競爭條件
- 23. Stream.WriteTo鎖定了線程
- 24. 鎖將如何響應競爭條件?
- 25. 從單個線程填充ConcurrentHashMap,然後從多個線程讀取而沒有任何競爭條件?
- 26. 多個NSManagedObjectContexts - 防止競爭條件和死鎖
- 27. 鎖定多個線程
- 28. 兩個線程程序防止死鎖
- 29. 檢查一個並行線程互斥鎖定或解鎖(後一個線程已經鎖定本身)
- 30. 在情感分析中捕獲兩個競爭利益相關者的觀點
謝謝。另外,似乎同步(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