您好,登錄后才能下訂單哦!
ConcurrentHashMap 和 Hashtable 的區(qū)別是什么,很多新手對此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
從原理上分析,Hashtable 實(shí)現(xiàn)并發(fā)安全的原理是通過 synchronized 關(guān)鍵字,從源碼角度,以 clear() 方法為例,代碼如下:
public synchronized void clear() { Entry<?,?> tab[] = table; modCount++; for (int index = tab.length; --index >= 0; ) tab[index] = null; count = 0; }
clear() 方法是被 synchronized 關(guān)鍵字所修飾的,同理其他的方法例如 put、get、size 等,也同樣是被 synchronized 關(guān)鍵字修飾的。之所以 Hashtable 是線程安全的,是因?yàn)閹缀趺總€(gè)方法都被 synchronized 關(guān)鍵字所修飾了,這也就保證了線程安全。
Collections.SynchronizedMap(new HashMap()) 的原理和 Hashtable 類似,也是利用 synchronized 實(shí)現(xiàn)的。
而 ConcurrentHashMap 實(shí)現(xiàn)的原理,卻有大大的不同
本質(zhì)上它實(shí)現(xiàn)線程安全的原理是利用了 CAS + synchronized + Node 節(jié)點(diǎn)的方式,這和 Hashtable 的完全利用 synchronized 的方式有很大的不同。
因?yàn)樗鼈冊诰€程安全的實(shí)現(xiàn)方式上的不同,導(dǎo)致它們在性能方面也有很大的不同。當(dāng)線程數(shù)量增加的時(shí)候:
Hashtable 的性能會(huì)急劇下降,因?yàn)槊恳淮涡薷亩夹枰i住整個(gè)對象,而其他線程在此期間是不能操作的。不僅如此,還會(huì)帶來額外的上下文切換等開銷,所以此時(shí)它的吞吐量甚至還不如單線程的情況。
而在 ConcurrentHashMap 中,就算上鎖也僅僅會(huì)對一部分上鎖而不是全部都上鎖,所以多線程中的吞吐量通常都會(huì)大于單線程的情況,也就是說,在并發(fā)效率上,ConcurrentHashMap 比 Hashtable 提高了很多。
Hashtable(包括 HashMap)不允許在迭代期間修改內(nèi)容,否則會(huì)拋出ConcurrentModificationException 異常,其原理是檢測 modCount 變量,迭代器的 next() 方法的代碼如下:
public T next() { if (modCount != expectedModCount) throw new ConcurrentModificationException(); return nextElement(); }
next() 方法中,會(huì)首先判斷 modCount 是否等于 expectedModCount。其中 expectedModCount 是在迭代器生成的時(shí)候隨之生成的,并且不會(huì)改變。
它所代表的含義是當(dāng)前 Hashtable 被修改的次數(shù),而每一次去調(diào)用 Hashtable 的包括 addEntry()、remove()、rehash() 等方法中,都會(huì)修改 modCount 的值。這樣一來,如果我們在迭代的過程中,去對整個(gè) Hashtable 的內(nèi)容做了修改的話,也就同樣會(huì)反映到 modCount 中。這樣一來,迭代器在進(jìn)行 next 的時(shí)候,也可以感知到,于是它就會(huì)發(fā)現(xiàn) modCount 不等于 expectedModCount,就會(huì)拋出 ConcurrentModificationException 異常。
所以對于 Hashtable 而言,它是不允許在迭代期間對內(nèi)容進(jìn)行修改的。
相反,ConcurrentHashMap 即便在迭代期間修改內(nèi)容,也不會(huì)拋出ConcurrentModificationException。
如果我們有并發(fā)的場景,那么使用 ConcurrentHashMap 是最合適的,Hashtable 已經(jīng)不再推薦使用。
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。