Java 6 API問題。是否LockSupport.unpark(thread)
有一個發生在之間的關係從LockSupport.park
返回在剛剛unparked線程?我強烈懷疑答案是肯定的,但Javadoc似乎沒有明確提及它。Java LockSupport內存一致性
7
A
回答
1
我已經查看了JDK代碼,它看起來像LockSupport方法通常在同步塊之外調用。所以,你的假設似乎是正確的。
5
如果它沒有記錄成這樣,那麼你不能依靠它創建關係之前發生的事情。
特別是Hotspot代碼中的LockSupport.java只需調用Unsafe.park和.unpark!
發生在之間的關係通常來自易失性狀態標誌或類似物上的寫讀取對。
請記住,如果沒有記錄爲創建之前發生關係,那麼你必須把它當作雖然它不能使用,即使你能證明它特定的系統上。未來的系統和實現可能不會。他們有充分的理由讓自己離開了自由。
6
我剛剛發現這個問題,因爲我問自己同樣的事情。根據Oracle研究人員David Dice的this article,答案似乎是沒有。下面是文章的相關部分:
如果一個線程被阻塞在
park()
我們保證後續unpark()
將使它準備。park()
和unpark()
的執行完全合法但是質量較差 將是空方法,其中 程序退化爲簡單旋轉。 其實這就是 石蕊試驗正確park()
-unpark()
的用法。
空park()
和unpark()
方法不給你任何之前發生關係的保證,所以對於你的程序是100%可移植的,你不應該依賴他們。
話又說回來,Javadoc of LockSupport說:
這些方法被設計用來作爲工具,用於創建 更高級別的同步實用程序,而不是本身對於大多數併發控制應用 有用。該
park
方法 只在形式的結構設計用於:
while (!canProceed()) { ... LockSupport.park(this); }
既然你反正明確檢查一些條件,這將既涉及volatile
或適當地同步變量,弱擔保park()
實際上不應該是問題,對吧?
相關問題
- 1. Java線程 - 內存一致性錯誤
- 2. 內存一致性 - 在Java中發生之前的關係
- 3. 內存一致性||線程干擾|| Php
- 4. java.util.concurrent中的內存一致性
- 5. Java性能不一致
- 6. 逼出來的java內存..不一致的java行爲
- 7. 共享內存一致性的鎖定機制
- 8. Linux內存報告不一致
- 9. Java註釋和方法一致性
- 10. Drupal內容重複和一致性
- 11. 數據集內的評分一致性
- 12. UIScrollView內部一致性崩潰
- 13. 爲什麼LockSupport Java提供但不實用
- 14. 一致性緩存| ConcurrentHashMap in,HashMap out
- 15. 熱重載一致性緩存config.xml
- 16. SMP中的緩存一致性更新
- 17. Java Appengine APPSTATS導致java內存不足錯誤
- 18. 系統如何確保內存和緩存之間的一致性
- 19. glTexImage2D導致內存泄漏
- 20. 具有大量內存的Java性能
- 21. 的Java持久性內存泄漏
- 22. Java Arraylist的內存和性能
- 23. java持久性內存泄漏
- 24. LookupTables一致性
- 25. XPATH一致性
- 26. 一致性$ _GET
- 27. SoundPlayer導致內存泄漏?
- 28. IntPtr導致內存泄漏?
- 29. jsonObjectWithData導致內存崩潰?
- 30. Drawrect導致內存問題
很抱歉對這樣一箇舊的答案發表評論,但是由於問題是關於Java * API *而不是Sun/Oracle提供的*實現*,所以查看JDK如何使用'LockSupport'並不是100%正確的。 JDK開發人員可能會對其自己的實現做出假設,而便攜式應用程序則不應該這樣做。另外,還有一些方法可以實現* happen-before *關係,而不涉及任何'synchronized'塊。 – rolve 2013-12-02 13:28:39
「......通過JDK代碼查看」:您是否可以爲OpenJDK發佈一個hg URL? – kevinarpe 2015-12-17 08:29:58