2016-02-21 30 views
-3


最近我有一個關於Java併發的朋友討論,他問我,爲什麼或者是周圍的代碼或方法慢塊synchronized關鍵字。我回答說它速度很慢,因爲它爭奪一個對象監視器。此外,它還會在保證之前發生,並且必須將其緩存中的所有變量與主內存同步,並在該塊的結尾處將緩存刷新回去。它還可以防止編譯器以及指令的cpu重新排序。但他表示,這些會導致經濟放緩,但這不是造成性能下降的主要原因。本質上,即使線程遇到同步塊時沒有爭用,它也會從用戶模式切換到內核模式,並且線程必須保存狀態,然後當它離開塊時必須再次重新加載狀態。我試圖在網上找到描述這一點的文獻,但我找不到任何文獻。我想知道是否有人可以證實這是正確的?爲什麼java線程在同步之前進入內核模式,爲什麼不在這之前?這與link中提出的問題不同,因爲我詢問從用戶模式到內核模式的顯式切換,並且這會導致性能下降?爲什麼在java中同步關鍵字慢?

+0

嘗試閱讀這個答案[爲什麼同步在Java中貴嗎?(http://stackoverflow.com/a/1671097/1346996)。 – aribeiro

+0

Downvoters沒有閱讀這個問題。當你暗示Java同步很慢時,他們就不喜歡它 –

回答

1

你的朋友告訴你的是絕對不正確的。

關於同步的東西太貴了,你幾乎是正確的。最困難的部分實際上是(特別是在x86/x86_64處理器上)比較和交換指令,它比較並設置當前線程爲鎖的所有者。在x86/x86_64上使用cmpxchg指令,當它到達主存時,它比任何常規指令都慢。正如你所提到的,記憶障礙會減慢緩存。

在某些其它結構中,特別是基於RISC的,通常是無源負載獨家/存儲獨家使用其通常是快得多。所以這可能會從架構到架構不同。

無論如何,爪哇(以及任何其他語言)試圖避免進入內核和大多數mutext實現僅做幾次重試後時,它幾乎是明確指出,線程需要被暫停。

相關問題