線程安全的本質(zhì):
ConcurrentHashMap:本質(zhì)上是創(chuàng)建一個(gè)HashEntry數(shù)組去存儲(chǔ)元素。分段去鎖數(shù)據(jù)
Collections.synchronizedMap(): 本質(zhì)上是返回一個(gè) SynchronizedMap
主要的不同:
ConcurrentHashMap:更新的時(shí)候,它會(huì)鎖住部分?jǐn)?shù)據(jù) ,其他的數(shù)據(jù)能夠被其他線程調(diào)用
Collections.synchronizedMap():更新的時(shí)候鎖住所有數(shù)據(jù),其他線程無(wú)法介入,除非這個(gè)鎖釋放
注意:如果有許多更新操作,或者相對(duì)來(lái)說(shuō)較多的讀取操作,應(yīng)該選擇ConcurrentHashMap
另一個(gè)不同:
ConcurrentHashMap不會(huì)保留元素傳入的順序,和HashMap差不多
進(jìn)一步說(shuō),ConcurrentHashMap能保證不會(huì)出現(xiàn)ConcurrentModificationException 這個(gè)異常,當(dāng)一個(gè)線程在更新,
另一個(gè)線程也去訪問(wèn)的時(shí)候。
但是Collections.synchronizedMap()無(wú)法保證。
拓展:ConcurrentSkipListMap (since 1.6版本以后)兼顧上邊兩個(gè)的有點(diǎn),有序和不報(bào)異常