我發現幾乎所有高級同步抽象(如Semaphore,CountDownLatch,來自java.util.concurrent的Exchanger)和併發集合都使用Unsafe(比如compareAndSwapInt方法)中的方法來定義臨界區。同時,我預計同步塊或方法將用於此目的。 你能解釋一下,不安全的方法(我的意思是隻能自動設置一個值的方法)比同步更有效率,它爲什麼如此?不安全的compareAndSwapInt與同步
1
A
回答
4
如果您希望等待很長時間(例如毫秒),使用synchronised
可以更高效,因爲線程可以睡着並釋放CPU來完成其他工作。如果您期望操作很快發生,使用compareAndSwap
會更有效。這是因爲它是一個簡單的機器代碼指令,只需要10 ns。但是,如果資源非常令人滿意,則此指令必須忙於等待,如果無法獲得所需的值,則可能會耗盡CPU,直到它耗盡爲止。
如果使用堆內存,則可以控制共享數據的佈局並避免錯誤共享(多個CPU正在更新相同的高速緩存行)。當你想要獨立更新多個值時,這很重要。例如爲環形緩衝區。
注意,內部實現的典型JVM的(例如,熱點)將經常使用的比較並交換硬件指令作爲部分實施如果這樣的指令是可用的(例如,。86),而另一種常見的替代方案是LL/SC(例如POWER,ARM)。一種典型的策略是使用比較和交換(或等效)的快速路徑來嘗試獲得鎖,如果該鎖是空閒的,則可能有短暫的spin-loop,最後如果該鎖失敗回退到OS級阻塞原語(例如,futex,Events)。細節遠遠超出了這個範圍,並且包括諸如biased locking之類的技術,並且最終取決於實現。
相關問題
- 1. Asp.net上的MongoDB:安全同步寫入
- 2. 安全和不安全網站之間的部分數據庫同步?
- 3. 如何確保與sqlite和NFS安全的文件同步
- 4. 安全地同步COM線程
- 5. 爲線程安全同步NSMutableArray?
- 6. 同步CRM 2011和SharePoint安全
- 7. Android ID全部不同步
- 8. 在不安全頁面上的安全iframe在不同的域
- 9. 如何同步數據源更新與tableview重新加載與線程安全?
- 10. 使用異步和不安全
- 11. 數字安全如何與信息/網絡/基礎設施安全不同?
- 12. 已安裝的Xen映像不與實際驅動器同步
- 13. Sonarlint不與SonarQube同步
- 14. SSL - 安全和不安全的東西在同一頁上
- 15. 同步不同步
- 16. 在與.net不同的節點中創建的安全令牌
- 17. 從另一個同步方法調用同步方法是否安全?
- 18. mailx與uuencode是否安全,如果不是安全的方式
- 19. 編寫同步線程安全的包裝器的NavigableMap
- 20. Java:使用同步方法的類中的線程安全
- 21. Grails項目中的不同登錄控制器與Spring安全
- 22. NET HTTPS請求與跨線程的不同安全協議
- 23. PHP不同的服務器和安全
- 24. winsock 2.同步發送的線程安全。 tcp
- 25. 如何同步ASP.NET和Tomcat之間的會話/安全性?
- 26. 默認的MVC安全性是否利用與ASP相同的安全性.NEt
- 27. 不是ruby隊列線程安全爲什麼隊列不同步?
- 28. 與github同步
- 29. Java多線程:線程安全數據結構與同步方法
- 30. Swagger對不同的標籤有不同的安全性嗎?
你能詳細說一下最後一段嗎?小混亂[這裏](https://stackoverflow.com/q/47851595/3317808) – overexchange
最後一段引用哪個JVM? – EJP
我編輯了一下,以澄清在另一個線程混淆的背景下。我認爲關鍵在於Peter在最後一段提到硬件CAS指令(或類似指令),而不是任何導致混淆的Java語言級別的compareAndSwap方法或算法。 – BeeOnRope