2種辦法讓HashMap執行緒安全
HashMap不是執行緒安全的,往往在寫程式時需要通過一些方法來回避.其實JDK原生的提供了2種方法讓HashMap支援執行緒安全.
方法一:通過Collections.synchronizedMap()返回一個新的Map,這個新的map就是執行緒安全的. 這個要求大家習慣基於介面程式設計,因為返回的並不是HashMap,而是一個Map的實現.
方法二:重新改寫了HashMap,具體的可以檢視java.util.concurrent.ConcurrentHashMap. 這個方法比方法一有了很大的改進.
下面對這2中實現方法從各個角度進行分析和比較.
實現原理 鎖機制的不同 如何得到/釋放鎖 優缺點
1)實現原理
方法一原理:
通過Collections.synchronizedMap()來封裝所有不安全的HashMap的方法,就連toString, hashCode都進行了封裝. 封裝的關鍵點有2處,1)使用了經典的synchronized來進行互斥, 2)使用了代理模式new了一個新的類,這個類同樣實現了Map介面.
private static class SynchronizedMap
相關推薦
2種辦法讓HashMap執行緒安全
HashMap不是執行緒安全的,往往在寫程式時需要通過一些方法來回避.其實JDK原生的提供了2種方法讓HashMap支援執行緒安全. 方法一:通過Collections.synchronizedMap()返回一個新的Map,這個新的map就是執行緒安全的. 這
2種辦法讓HashMap線程安全
hash 詳細 put 指令 shc bool code 高並發 only HashMap不是線程安全的,往往在寫程序時需要通過一些方法來回避.其實JDK原生的提供了2種方法讓HashMap支持線程安全. 方法一:通過Collections.synchronizedMap(
設計模式之單例模式【內附物件例項化幾種方式、實現執行緒安全幾種方式】
繼續來複習常用的設計模式-單例模式,順便回憶一下執行緒安全的幾種實現方式。 一、什麼是單例模式 單例模式,簡單常用的一種設計模式,也很好的體現了程式碼控制物件在記憶體數量的一種方式,主要分2種實現方式: ①餓漢式,執行緒安全 ②懶漢式,執行緒不安全(新增鎖機制,可以實現執行緒安全)
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
java多執行緒2:區域性變數的執行緒安全,實列變數的非執行緒安全
java多執行緒2:區域性變數的執行緒安全,實列變數的非執行緒安全 “非執行緒安全“就是在多個執行緒訪問同一個物件的例項變數進行併發訪問時候發生,產生的後果就是”髒讀“,也就是取到的資料其實是被修改過的。 a.多執行緒訪問區域性變數是執行緒安全的。 package multiThread
2.hashMap如何保證執行緒安全
一:hashMap執行緒不安全表現 (1)在兩個執行緒同時嘗試擴容HashMap時,可能將一個連結串列形成環形的連結串列,所有的next都不為空,進入死迴圈; (2)在兩個執行緒同時進行put時可能造成一個執行緒資料的丟失; 二:如何執行緒安全的使用hashMap (
java多執行緒2.執行緒安全之可見性
要編寫正確的併發程式,關鍵在於:在訪問共享的可變狀態時需要進行正確的管理 可見性: 同步的另一個重要目的——記憶體可見性。 我們不僅希望防止某個執行緒正在使用物件狀態而另一個執行緒同時在修改狀態,而且希望當一個執行緒修改了物件狀態後,其他執行緒能夠看到發生的狀態變化(互斥訪問/通訊效果
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
實現多執行緒安全的3種方式
實現多執行緒安全的3種方式 1、先來了解一下:為什麼多執行緒併發是不安全的? 在作業系統中,執行緒是不擁有資源的,程序是擁有資源的。而執行緒是由程序建立的,一個程序可以建立多個執行緒,這些執行緒共享著程序中的資源。所以,當執行緒一起併發執行時,同時對一個數據進行修改,就
java中為什麼Hashtable是執行緒安全的,而HashMap是執行緒不安全的?還有ArrayList為什麼是執行緒不安全的,Vector是執行緒安全的??
文章目錄 一、HashMap解析 二、Hashtable解析 三、Collections.synchronizedMap()解析 四、ConcurrentHashMap 六、ArrayList為什麼是執行緒不安全的,Vector是執行緒安全的?
執行緒安全的Map的實現方式3種
1. HashMap,TreeMap 未進行同步考慮,是執行緒不安全的。 2. HashTable 和 ConcurrentHashMap 都是執行緒安全的。區別在於他們對加鎖的範圍不同,HashTable 對整張Hash表進行加鎖,而ConcurrentHashMap將Hash表分為16桶(s
Java基礎多執行緒之執行緒安全-同步鎖三種形式
首先,我們通過一個案例,演示執行緒的安全問題: 電影院要賣票,我們模擬電影院的賣票過程。假設要播放的電影是 “葫蘆娃大戰奧特曼”,本次電影的座位共100個(本場電影只能賣100張票)。我們來模擬電影院的售票視窗,實現多個視窗同時賣 “終結者”這場電影票(多個視窗一起賣這100張票)需要視窗
Java單例模式的三種執行緒安全版本
Double check public class Singleton{ private static class SingletonHolder{ private static Singleton instance = new Singleton(); } private Sing
併發下HashMap為什麼不是執行緒安全的?
首先看下HashMap的工作原理,我們回顧一下HashMap的結構: HashMap的結構就是雜湊表,底層是一個數組,這個陣列中儘可能地分散所有的key,通過key的hash值得到陣列下標,然後把entry插到該陣列
iOS中保證執行緒安全的幾種方式與效能對比
一、前言 前段時間看了幾個開源專案,發現他們保持執行緒同步的方式各不相同,有@synchronized、NSLock、dispatch_semaphore、NSCondition、pthread_mutex、OSSpinLock。後來網上查了一下,發現他們的實現機制各不相同,效能也各不一
Collection、ArrayList、HashMap、HashSet轉為執行緒安全(集合的安全性問題)
最近在看bugly的是否,發現二維碼掃描程式碼中有一段報錯了,執行緒不安全問題. 裡面有段 new HashSet() 程式碼,這個HashSet,底層是採用HashMap來實現的,執行緒不是安全的, 所以有時候會有執行緒不安全的問題產生. 前言:Collecti
Java併發程式設計 之 HashMap執行緒不安全
我想在平時的多執行緒程式設計中,容器的使用是很普遍的,但是你有沒有考慮過有些容器是不安全的,如Haspmap、ArrayList。這裡講解一下Hashmap不安去體現在哪裡。 插入時不安全: 如果有兩個執行緒A和B,都進行插入資料,剛好經過雜湊計算後得到的雜湊碼是一樣的,即插入的
讓你秒懂執行緒和執行緒安全,只需5步!
在探討執行緒安全之前,我們先來聊聊什麼是程序。 什麼是程序? 電腦中時會有很多單獨執行的程式,每個程式有一個獨立的程序,而程序之間是相互獨立存在的。比如下圖中的QQ、酷狗播放器、電腦管家等等。 什麼是執行緒? 程序想要執行任務就需要依賴執行緒。換句話說,就是程