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
相關推薦
J.U.C之Java併發容器:ConcurrentHashMap
HashMap是我們用得非常頻繁的一個集合,但是由於它是非執行緒安全的,在多執行緒環境下,put操作是有可能產生死迴圈的,導致CPU利用率接近100%。為了解決該問題,提供了Hashtable和Collections.synchronizedMap(hashMap)兩種解決方
JAVA併發容器:為什麼說ConcurrentHashMap是弱一致性的?
ConcurrentHashMap的弱一致性體現在clear、迭代器和get方法,原因在於沒有加鎖。 舉例: 迭代器在遍歷資料的時候是一個Segment一個Segment去遍歷的,如果在遍歷完一個Segment時正好有一個執行緒在剛遍歷完的Segment上插入資料,就會體現出不一致性。 cl
JAVA併發容器:JDK1.7 與 1.8 ConcurrentHashMap 區別
生活 為什麼我們總是沒有時間把事情做對,卻有時間做完它? 瞭解ConcurrentHashMap 工作中常用到hashMap,但是HashMap在多執行緒高併發場景下並不是執行緒安全的。 所以引入了ConcurrentHashMap,它是HashMap的執行緒安全版本,採用了分段
【搞定Java併發程式設計】第21篇:Java併發容器之ConcurrentHashMap詳解
上一篇:讀寫鎖 --- ReentrantReadWriteLock詳解 本文目錄: 1、為什麼要使用ConcurrentHashMap? 2、ConcurrentHashMap的實現 2.1、ConcurrentHashMap中主要的成員變數、成員方法和內部類 2.2、分段鎖的
Java併發容器:ConcurrentLinkedQueue
轉自:https://blog.csdn.net/chenssy/article/details/74853120 http://cmsblogs.com/ 要實現一個執行緒安全的佇列有兩種方式:阻塞和非阻塞。阻塞佇列無非就是鎖的應用,而非阻塞則是CAS演算法的應用。下面我們就開始一個非
JAVA併發容器:ConcurrentSkipListMap
生活 目標定下來以後就不要去變,只要確定是對的,總可以到達。 二分查詢 二分查詢要求有序性,為了保障可以隨機訪問,因此會把資料儲存在連續的記憶體中,在查詢的時候效率高,但是在增加和刪除時需要大量移動元素以保證有序,所以效率不高。 如果需要快速的二分查詢,又要兼顧刪除增加元素的效率
JAVA併發容器:CopyOnWriteArrayList與CopyOnWriteArraySet
生活 所有的程式設計師都劇作家,而所有計算機都是糟糕的演員。 CopyOnWriteArrayList介紹 還記得學集合的時候,學的第一個集合就是ArrayList.它是一個由陣列實現的集合。因為他對陣列的增刪改和查詢都是不加鎖的,所以它並不是執行緒安全的。 因此,我們會引入到一
Java併發5:ConcurrentHashMap
為什麼要使用 ConcurrentHashMap HashMap 是非執行緒安全的,put操作可能導致死迴圈。其解決方案有 HashTable 和 Collections.synchronizedMap(hashMap) 。這兩種方案都是對讀寫加鎖,獨佔式,效率比較低下。 HashMap 在併發執行put
【轉】Java併發程式設計:併發容器之ConcurrentHashMap
JDK5中添加了新的concurrent包,相對同步容器而言,併發容器通過一些機制改進了併發效能。因為同步容器將所有對容器狀態的訪問都序列化了,這樣保證了執行緒的安全性,所以這種方法的代價就是嚴重降低了併發性,當多個執行緒競爭容器時,吞吐量嚴重降低。因此Java5.0開始針對多執行緒併發訪問設計,提供了併
10-Java併發程式設計:併發容器之ConcurrentHashMap(轉載)
Java併發程式設計:併發容器之ConcurrentHashMap(轉載) 下面這部分內容轉載自: JDK5中添加了新的concurrent包,相對同步容器而言,併發容器通過一些機制改進了併發效能。因為同步容器將所有對容器狀態的訪問都 序列化了,這樣保證了執
Java併發程式設計:併發容器之ConcurrentHashMap
下面這部分內容轉載自: JDK5中添加了新的concurrent包,相對同步容器而言,併發容器通過一些機制改進了併發效能。因為同步容器將所有對容器狀態的訪問都 序列化了,這樣保證了執行緒的安全性,所以這種方法的代價就是嚴重降低了併發性,當多個執行緒
【轉】Java併發程式設計:同步容器
為了方便編寫出執行緒安全的程式,Java裡面提供了一些執行緒安全類和併發工具,比如:同步容器、併發容器、阻塞佇列、Synchronizer(比如CountDownLatch)。今天我們就來討論下同步容器。 一、為什麼會出現同步容器? 在Java的集合容器框架中,主要有四大類別:Li
【34】Java併發程式設計:併發容器之CopyOnWriteArrayList(轉載)
Java併發程式設計:併發容器之CopyOnWriteArrayList(轉載) 原文連結: http://ifeve.com/java-copy-on-write/ Copy-On-Write簡稱COW,是一種用於程式設計中的優化策略。其基本思路是,從一開始大家都
11-Java併發程式設計:併發容器之CopyOnWriteArrayList(轉載)
Java併發程式設計:併發容器之CopyOnWriteArrayList(轉載) 原文連結: Copy-On-Write簡稱COW,是一種用於程式設計中的優化策略。其基本思路是,從一開始大家都在共享同一個內容,當某個人想要修改這個內容的時候,才會真正把內容
(2.1.27.16)Java併發程式設計:Lock之ConcurrentHashMap
ConcurrentHashMap 和 HashMap 的底層實現都是 陣列+連結串列或紅黑樹 構成的。 HashMap 的原始碼分析見:Java集合框架——HashMap原始碼分析 ConcurrentHashMap 相比 HashMap 支援多執行緒下的操
【4】Java併發程式設計:多執行緒中的快取一致性和CAS
一、匯流排鎖定和快取一致性 基本概念 這是兩個作業系統層面的概念。隨著多核時代的到來,併發操作已經成了很正常的現象,作業系統必須要有一些機制和原語,以保證某些基本操作的原子性,比如處理器需要保證讀一個位元組或寫一個位元組是原子的,那麼它是如何實現的呢?有
Java併發程式設計:併發容器之CopyOnWriteArrayList(轉載)
原文連結: Copy-On-Write簡稱COW,是一種用於程式設計中的優化策略。其基本思路是,從一開始大家都在共享同一個內容,當某個人想要修改這個內容的時候,才會真正把內容Copy出去形成一個新的內容然後再改,這是一種延時懶惰策略。從JDK1.5開始J
Java併發容器ConcurrentHashMap原理及HashMap死迴圈原因的分析
HashMap是我們最常用的資料結構之一,它方便高效,但遺憾的是,HashMap是執行緒不安全的,在併發環境下,在HashMap的擴容過程中,可能造成散列表的迴圈鎖死。而執行緒安全的HashTable使用了大量Synchronized鎖,導致了效率非常低下。幸運的是,併發程
Java高併發程式設計(八):Java併發容器和框架
1. ConcurrentHashMap 1.1 ConcurrentHashMap的優勢 在併發程式設計中使用HashMap可能導致程式死迴圈。而使用執行緒安全的HashTable效率又非 常低下,基於以上兩個原因,便有了ConcurrentHashMap的登場機會。
Java併發指南14:Java併發容器ConcurrentSkipListMap與CopyOnWriteArrayList
這位大俠,這是我的公眾號:程式設計師江湖。 分享程式設計師面試與技術的那些事。 乾貨滿滿,關注就送。 到目前為止,我們在Java世界裡看到了兩種實現key-value的資料結構:Hash、TreeMap,這兩種資料結構各自都有著優缺點。 Hash表:插入、查詢最快,