最近我有一個關於Java併發的朋友討論,他問我,爲什麼或者是周圍的代碼或方法慢塊synchronized關鍵字。我回答說它速度很慢,因爲它爭奪一個對象監視器。此外,它還會在保證之前發生,並且必須將其緩存中的所有變量與主內存同步,並在該塊的結尾處將緩存刷新回去。它還可以防止編譯器以及指令的cpu重新排序。但他表示,這些會導致經濟放緩,但這不是造成性能下降的主要原因。本質上,即使線程遇到同步塊時沒有爭用,它也會從用戶模式切換到內核模式,並且線程必須保存狀態,然後當它離開塊時必須再次重新加載狀態。我試圖在網上找到描述這一點的文獻,但我找不到任何文獻。我想知道是否有人可以證實這是正確的?爲什麼java線程在同步之前進入內核模式,爲什麼不在這之前?這與link中提出的問題不同,因爲我詢問從用戶模式到內核模式的顯式切換,並且這會導致性能下降?爲什麼在java中同步關鍵字慢?
-3
A
回答
1
你的朋友告訴你的是絕對不正確的。
關於同步的東西太貴了,你幾乎是正確的。最困難的部分實際上是(特別是在x86/x86_64處理器上)比較和交換指令,它比較並設置當前線程爲鎖的所有者。在x86/x86_64上使用cmpxchg
指令,當它到達主存時,它比任何常規指令都慢。正如你所提到的,記憶障礙會減慢緩存。
在某些其它結構中,特別是基於RISC的,通常是無源負載獨家/存儲獨家使用其通常是快得多。所以這可能會從架構到架構不同。
無論如何,爪哇(以及任何其他語言)試圖避免進入內核和大多數mutext實現僅做幾次重試後時,它幾乎是明確指出,線程需要被暫停。
相關問題
- 1. 爲什麼存在異步關鍵字
- 2. 同步Java塊中volatile關鍵字的重要性是什麼?
- 3. java中的同步關鍵字
- 4. 我爲什麼要通過對象鎖關鍵字而同步
- 5. 如何實現同步java關鍵字?
- 6. 關鍵字同步和同步概念
- 7. Java中的native關鍵字是什麼?
- 8. 什麼是Java中的關鍵字?
- 9. 爲什麼JavaScript函數需要關鍵字「異步」? 「await」關鍵字不夠嗎?
- 10. 爲什麼在java中使用`transient`關鍵字?
- 11. 在Java中,爲什麼instanceof是關鍵字而不是方法?
- 12. 爲什麼在Java中創建'const'關鍵字?
- 13. 在java中同步關鍵字和靜態類
- 14. javascript的'this'關鍵字與java的'this'關鍵字有什麼不同?
- 15. 什麼是Java的「自我」關鍵字
- 16. 關於Java參考和同步關鍵字實踐的問題?
- 17. 爲什麼要避免Java中的C++關鍵字?
- 18. Java中的監控和同步關鍵字
- 19. 替代Java中的「同步」關鍵字進行多線程
- 20. 爲什麼不在Monotouch中同步TaskScheduler.FromCurrentSynchronizationContext?
- 21. 爲什麼我不能在java中同步實例塊?
- 22. 什麼是java中的線程同步?
- 23. 「this」關鍵字在Java的「.addActionListener(this)」中引用了什麼?
- 24. 什麼是在java中使用「this」關鍵字
- 25. 在這個java方法中超級關鍵字是什麼?
- 26. 爲什麼需要virtual關鍵字?
- 27. 爲什麼「包裝」關鍵字和.h?
- 28. 爲什麼使用void關鍵字?
- 29. 爲什麼Collate關鍵字出錯?
- 30. 爲什麼使用params關鍵字
嘗試閱讀這個答案[爲什麼同步在Java中貴嗎?(http://stackoverflow.com/a/1671097/1346996)。 – aribeiro
Downvoters沒有閱讀這個問題。當你暗示Java同步很慢時,他們就不喜歡它 –