HashMap執行緒安全問題
主要集中在put操作和map擴容resize方法上,這2個方法都沒有執行緒同步
1、當多個執行緒向map put時,如果有2個或以上的key(來自不同執行緒)的hash結果一樣(hash碰撞),則只有一個執行緒能put成功,其他執行緒資料丟失
2、map在超過內建的尺寸範圍,則會呼叫resize方法對map擴容,從原始碼中看出是重新建立一個Entry陣列,並重新hash,重新複製元素,再放到table中,如果多個執行緒同時執行這些操作,則只會有一個執行緒擴容後的陣列賦值給table,其他執行緒資料丟失
執行緒安全辦法有
1、使用hashtable:加了synchronized關鍵字(同步方法),效率低
2、concurrentHashMap:使用了鎖分段技術,將資料分段加鎖,效率高(jdk8中使用了CAS演算法,拋掉了segment段)
3、synchronizedMap:同樣使用了synchronized關鍵字(同步程式碼塊)
相關推薦
1000-ms-HashMap 執行緒安全安全問題
問題: HashMap是否是執行緒安全 詳解 http://www.importnew.com/21396.html 有原始碼分析 和程式碼效能比較 CHM效能最好 HashMap不是執行緒安全的;Hashtable執行緒安全,但效率低,因為是Hashtable是使用synchronized的,所有執行緒
HashMap執行緒安全問題
主要集中在put操作和map擴容resize方法上,這2個方法都沒有執行緒同步 1、當多個執行緒向map put時,如果有2個或以上的key(來自不同執行緒)的hash結果一樣(hash碰撞),則只有一個執行緒能put成功,其他執行緒資料丟失 2、map在超過內建的尺寸範圍,則會呼叫resi
2種辦法讓HashMap執行緒安全
HashMap不是執行緒安全的,往往在寫程式時需要通過一些方法來回避.其實JDK原生的提供了2種方法讓HashMap支援執行緒安全. 方法一:通過Collections.synchronizedMap()返回一個新的Map,這個新的map就是執行緒安全的. 這
HashMap執行緒不安全的表現 -- Java 8
HashMap執行緒不安全的表現 -- Java 8 先來看看HashMap.put方法的原始碼 public V put(K key, V value) { return putVal(hash(key), key, value, false, true); }
關於hashmap和hashtable的區別,及如何使hashmap變得執行緒安全?(除了synchronized)---concurrentHashmap
我們都知道hashmap是執行緒不安全的,而效率也比較高,他允許我們存入null鍵及null值; 而 hashtable 是執行緒安全的,其效率比較低,不允許我們存入null鍵和null值; 除了非同步及允許使用null值,hashmap與hashtable基本相同; 那麼為什麼hash
java中為什麼Hashtable是執行緒安全的,而HashMap是執行緒不安全的?還有ArrayList為什麼是執行緒不安全的,Vector是執行緒安全的??
文章目錄 一、HashMap解析 二、Hashtable解析 三、Collections.synchronizedMap()解析 四、ConcurrentHashMap 六、ArrayList為什麼是執行緒不安全的,Vector是執行緒安全的?
併發下HashMap為什麼不是執行緒安全的?
首先看下HashMap的工作原理,我們回顧一下HashMap的結構: HashMap的結構就是雜湊表,底層是一個數組,這個陣列中儘可能地分散所有的key,通過key的hash值得到陣列下標,然後把entry插到該陣列
Collection、ArrayList、HashMap、HashSet轉為執行緒安全(集合的安全性問題)
最近在看bugly的是否,發現二維碼掃描程式碼中有一段報錯了,執行緒不安全問題. 裡面有段 new HashSet() 程式碼,這個HashSet,底層是採用HashMap來實現的,執行緒不是安全的, 所以有時候會有執行緒不安全的問題產生. 前言:Collecti
Java併發程式設計 之 HashMap執行緒不安全
我想在平時的多執行緒程式設計中,容器的使用是很普遍的,但是你有沒有考慮過有些容器是不安全的,如Haspmap、ArrayList。這裡講解一下Hashmap不安去體現在哪裡。 插入時不安全: 如果有兩個執行緒A和B,都進行插入資料,剛好經過雜湊計算後得到的雜湊碼是一樣的,即插入的
2.hashMap如何保證執行緒安全
一:hashMap執行緒不安全表現 (1)在兩個執行緒同時嘗試擴容HashMap時,可能將一個連結串列形成環形的連結串列,所有的next都不為空,進入死迴圈; (2)在兩個執行緒同時進行put時可能造成一個執行緒資料的丟失; 二:如何執行緒安全的使用hashMap (
談談HashMap執行緒不安全的體現
我們先回顧一下HashMap。HashMap是一個數組連結串列,當一個key/Value對被加入時,首先會通過Hash演算法定位出這個鍵值對要被放入的桶,然後就把它插到相應桶中。如果這個桶中已經有元素了,那麼發生了碰撞,這樣會在這個桶中形成一個連結串列。一般來說,當有資料要插
HashMap為什麼不是執行緒安全的?
HashMap底層是一個Entry陣列,當發生hash衝突的時候,hashmap是採用連結串列的方式來解決的,在對應的陣列位置存放連結串列的頭結點。對連結串列而言,新加入的節點會從頭結點加入。 javadoc中關於hashmap的一段描述如下: 此實現不是同步的。如果多個執行緒同時訪
8. 造成HashMap非執行緒安全的原因
在前面我的一篇總結(6. 執行緒範圍內共享資料)文章中提到,為了資料能線上程範圍內使用,我用了 HashMap 來儲存不同執行緒中的資料,key 為當前執行緒,value 為當前執行緒中的資料。我取的時候根據當前執行緒名從 HashMap 中取即可。 因為當初學習 HashMap 和 HashTable 原
造成HashMap非執行緒安全的原因
我們知道 HashMap 底層是一個 Entry 陣列,當發生 hash 衝突的時候,HashMap 是採用連結串列的方式來解決的,在對應的陣列位置存放連結串列的頭結點。對連結串列而言,新加入的節點會從頭結點加入。javadoc 中有一段關於 HashMap 的描述: 此實現不是同步的。如果多個執
ArrayList和Vector的區別,HashMap和Hashtable的區別以及執行緒安全的理解
就ArrayList與Vector主要從二方面來說. 一.同步性:Vector是執行緒安全的,也就是說是同步的,而ArrayList是執行緒序不安全的,不是同步的 二.資料增長:當需要增長時,Vector預設增長為原來一培,而ArrayList卻是原來的
一次HashMap多執行緒安全引起的事故
事故分析 最近一次web工程上線,上線大概半個小時,出現了報警,16核的伺服器的cpu使用了1123%,程式出異常了。 Cpu利用率過高一般是因為出現了出現了死迴圈,導致部分執行緒一直執行。佔用cpu時間。使用jstack工具dump出問題的那臺伺服器的棧資訊。死迴圈的話
如何使用執行緒安全的HashMap
HashMap為什麼執行緒不安全 導致HashMap執行緒不安全的原因可能有兩種: 1、當多個執行緒同時使用put方法新增元素的時候,正巧存在兩個put的key發生了碰撞(根據hash值計算的bucket一樣),那麼根據HashMap的儲存原理,這兩個key會新增多陣列的同
ArrayList和Vector的區別,HashMap和Hashtable的區別以及執行緒安全的理解【轉】
http://www.cnblogs.com/xionglee/articles/1554701.html 就ArrayList與Vector主要從二方面來說. 一.同步性:Vector是執行緒安全的,也就是說是同步的,而ArrayList是執行緒序不安全的,不是同步的 二.資料增長:當需要增長時,Ve
Java集合框架之十三-------------HashMap的擴容與執行緒安全問題
HashMap擴容中,hash & oldCap的作用,觀察擴容前和擴容後下標的變化 原來的0101和10101在length=16的時候,通過hash&length-1的方法,計算出來都是0101;但是在擴容後即length=32時,hash&
【java併發】造成HashMap非執行緒安全的原因
0. 寫在前面 在前面我的一篇總結執行緒範圍內共享資料文章中提到,為了資料能線上程範圍內使用,我用了HashMap來儲存不同執行緒中的資料,key為當前執行緒,value為當前執行緒中的資料。