0

雖然經歷了Java 7 ConcurrentHashMap的內部實現,但我注意到要設置新的Segment,我們使用的是Unsafe類,它執行Ordered write並使用Compare和Swap算法,從而支持非阻塞行爲。在Java 7 ConcurrentHashMap中,爲什麼在寫入時需要分段鎖定?爲什麼我們不能再使用不安全來保持事物不被阻塞?

我的疑問是,爲什麼併發HashMap中不使用比較&交換算法或類似的東西,以保持讀&寫單鏈表無阻塞,而不是獲取上段鎖,然後寫單鏈表?

回答

0

在不安全的類中的方法通常是不安全的使用。只有在編寫庫的軟件工程師已經發現由於其他約束條件(如可能同時訪問數據的知識)或關於如何在各種處理器體系結構上實現基元的知識時才使用它們。

在這種情況下,一些工程師在Oracle已經確定了不安全的類可用於操縱段,但不適合單向鏈表。

+0

是的,我明白,不安全的類不應該被優先考慮,而是我們可以使用AtomicReferenceArray來完成相同的操作。不過,我想了解導致在段上使用鎖的限制是什麼。 –

+0

你應該試圖瞭解的是,這種不尋常的情況是允許使用不安全類的地方。 –

+0

實際上,在ConcurrentHashMap的文檔中已經提到它用於減少間接級別,因爲AtomicReferenceArray在內部使用Unsafe來提供有序寫入而不是易失性寫入。另外,如果我的理解是正確的,那麼它將有助於避免創建內存屏障的易失性寫入,從而導致略微更好的性能。如果我錯了,請糾正我。 –

相關問題