1. 程式人生 > >JAVA併發容器:為什麼說ConcurrentHashMap是弱一致性的?

JAVA併發容器:為什麼說ConcurrentHashMap是弱一致性的?

ConcurrentHashMap的弱一致性體現在clear、迭代器和get方法,原因在於沒有加鎖。
舉例:
迭代器在遍歷資料的時候是一個Segment一個Segment去遍歷的,如果在遍歷完一個Segment時正好有一個執行緒在剛遍歷完的Segment上插入資料,就會體現出不一致性。
clear也是一樣。
get方法在取資料的時候,如果有一個執行緒正好在put,假設他put的key是存在的,那麼get獲取資料的時候可以獲取到put的新值,因為HashEntry的value是volatile修飾的,所以在一個執行緒對其進行修改後,另一個執行緒可以馬上看到。
如果是一個新HashEntry,那麼就不能馬上看到,雖然HashEntry的陣列 table被volatile修飾,但是這樣只是代表table的引用地址如果被修改,其他執行緒可以立馬看到,並不代表table裡的資料被修改立馬可以看到。

至於更詳細的一些東西,有幾篇部落格寫的還是不錯的。
https://blog.csdn.net/wzq6578702/article/details/50908836
https://www.jianshu.com/p/77907ecc60e9