1. 程式人生 > >ConcurrentHashMap遍歷詳解

ConcurrentHashMap遍歷詳解

近期校招面試,問到ConcurrentHashMap遍歷問題,今天總結下:

在ConcurrentHashMap中,使用了分段鎖機制,所以任意數量的讀執行緒可以併發訪問Map、讀操作和寫操作的執行緒可以併發訪問Map、並且一定數量(預設是使用16個鎖)的寫執行緒也可以併發修改Map。ConcurrentHashMap提供的迭代器不會丟擲ConcurrentModificationExeption,而且具有弱一致性,它可以容忍併發的修改。當建立迭代器時會遍歷已有的元素,並可以(但是不保證)在迭代器被構造後將修改操作反映給容器。
那麼,當多個執行緒同時迭代一個ConcurrentHashMap的時候會發生什麼呢?在遍歷的時候更新又會發生什麼呢?
1,多個執行緒可以同時迭代ConcurrentHashMap;
2,ConcurrentHashMap保證遍歷的時候更新元素不會break(這正是併發容器的意義所在),但是不能保證資料的一致性,而迭代器保證的是:它反映的是建立迭代器時容器的狀態。

注意:
從ConcurrentHashMap那裡得到的iterator是為單執行緒設計的,即不可以傳遞它們,每一個執行緒都必須有自己的iterator。

例子:

(1)兩個讀執行緒和一個修改執行緒,每個執行緒各自擁有一個Iterator,併發訪問ConcurrentHashMap。

import java.util.Map;import java.util.Random;import java.util.UUID;import java.util.concurrent.ConcurrentHashMap;import java.util.concurrent.ExecutorService
;import java.util.concurrent.Executors;publicclassConcurrentMapIteration{privatefinalMap<String,String> map =newConcurrentHashMap<String,String>();privatefinalstaticint MAP_SIZE =100000;publicstaticvoid main(String[] args){newConcurrentMapIteration().run();}publicConcurrentMapIteration(){for(
int i =0; i < MAP_SIZE; i++){ map.put("key"+ i, UUID.randomUUID().toString());}}privatefinalExecutorService executor =Executors.newCachedThreadPool();privatefinalclassAccessorimplementsRunnable{privatefinalMap<String,String> map;publicAccessor(Map<String,String> map){this.map = map;}@Overridepublicvoid run(){for(Map.Entry<String,String> entry :this.map.entrySet()){System.out.println(Thread.currentThread().getName()+" - ["+ entry.getKey()+", "+ entry.getValue()+']');}}}

相關推薦

ConcurrentHashMap

近期校招面試,問到ConcurrentHashMap遍歷問題,今天總結下: 在ConcurrentHashMap中,使用了分段鎖機制,所以任意數量的讀執行緒可以併發訪問Map、讀操作和寫操作的執行緒可以併發訪問Map、並且一定數量(預設是使用16個鎖)的寫執行緒也可

OpenCV學習C++接口 Mat像素

pos get ++ art details 學習c++ pan detail 接口 OpenCV學習C++接口 Mat像素遍歷詳解OpenCV學習C++接口 Mat像素遍歷詳解

二叉樹深度優先

二叉樹的遍歷(每一種遍歷次序有遞迴實現(簡捷)和迭代實現兩種方式)深度優先遍歷1.遞迴實現中根遍歷的遞迴實現 vector<int> result; vector<int> inorderTraversal(TreeNode* root)

Map迴圈

HashMap迴圈遍歷方式及其效能對比 參考部落格:https://www.cnblogs.com/imzhj/p/5981665.html 1. Map的四種遍歷方式 下面只是簡單介紹各種遍歷示例(以HashMap為例),各自優劣會在本文後面進行分析給出結論。 (1) for each

JavaScriptES6物件之屬性的可列舉性及

目錄 可列舉性 屬性的遍歷 可列舉性 物件的每個屬性都有一個描述物件,用來控制該屬性的行為,Object.getOwnPropertyDescriptor方法可以獲取該屬性的描述物件。描述物件的enumerable屬性,稱為可列舉性,如果為true,為可列舉的,如

Morris——二叉樹先序中序後序( 時間複雜度O(N),空間複雜度O(1) )

Morris二叉樹遍歷: 來到當前的節點:Cur 如果Cur無左孩子,Cur向右移動 (Cur = Cur.right) 如果Cur有左孩子,找到Cur左子樹上最右的節點,記為 mostright

二叉樹前序,中序,後序

只要是搞計算機的,對資料結構中二叉樹遍歷都不陌生,但是如果用到的機會不多那麼就會慢慢淡忘,溫故而之新才是最好的學習方式,現在就重新溫習一下這方面的知識。 首先我想先改變這幾個遍歷的名字(前根序遍歷,中根序遍歷,後根序遍歷);前中後本來就是相對於根結點來說的,少一個字會產生很

二叉樹——前序、中序、後序、層序(遞迴非遞迴)

前言 前面介紹了二叉排序樹的構造和基本方法的實現。但是排序遍歷也是比較重要的一環。所以筆者將前中後序.和層序遍歷梳理一遍。 瞭解樹的遍歷,需要具有的只是儲備有佇列,遞迴,和棧。這裡筆者都有進行過詳細介紹,可以關注筆者資料結構與演算法專欄。持續分享,共同學習。 層序遍歷 層序遍歷。聽名字也知

AppCrawler自動化使用(版本2.1.0 )

穩定 second 而是 assert 重新 app awl 好用 國內 AppCrawle是自動遍歷的app爬蟲工具,最大的特點是靈活性,實現:對整個APP的所有可點擊元素進行遍歷點擊。 優點: 1.支持android和iOS, 支持真機和模擬器 2.可通過配置來設定

演算法學習——Map的四種方法

參考文獻:Java中如何遍歷Map物件的4種方法 java中的所有map都實現了Map介面,以下方法適用於任何map實現(HashMap, TreeMap, LinkedHashMap, Hashtable, and so on) 方法一 在for-each迴圈中使用entr

Map的四種方式及

1. Map的四種遍歷方式 下面只是簡單介紹各種遍歷示例(以HashMap為例),各自優劣會在本文後面進行分析給出結論。 (1) for each map.entrySet() Java

資料結構與演算法 -- 二叉樹鏈式((非)/遞迴,葉子個數,深度計算)

前言 PS:樹型結構是一種重要的非線性資料結構,教科書上一般都是樹與二叉樹,由此可見,樹和二叉樹是有區別和聯絡的,網上有人說二叉樹是樹的一種特殊形式,但經過查資料,樹和二叉樹沒有一個肯定的說法,但唯一可以肯定都是樹型結構。但是按照定義來看二叉樹並不是樹的一種特殊形式(下面解釋)。樹型資料結構的作

圖的深度優先(非遞迴+遞迴,

圖的深度優先遍歷 非遞迴演算法: #include<iostream> #include<stack> using namespace std; const int MaxSize=100; class MGraph{//鄰接矩陣的構建 p

c forEach 集合中的元素屬性,判斷是否是最後一個元素,

分享一下我老師大神的人工智慧教程吧。零基礎,通俗易懂!風趣幽默!http://www.captainbed.net/ 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

二叉樹的建立及三種方式

建立一個如下圖所示的二叉樹 程式如下: #include<stdio.h> #include<stdlib.h> //定義二叉樹 typedef struct _tree_node { char date; struct tree_node

AppCrawler自動化使用(版本2.1.0 )(轉)

AppCrawle是自動遍歷的app爬蟲工具,最大的特點是靈活性,實現:對整個APP的所有可點選元素進行遍歷點選。   優點: 1.支援android和iOS, 支援真機和模擬器 2.可通過配置來設定遍歷的規則(比如設定黑名單和白名單,提高遍歷的覆蓋率)

演算法 寬度(面試題

問題來源 https://segmentfault.com/q/1010000013091395?_ea=3284779 問題描述: 存在一個0,1值的二維陣列,給定一個座標[x,y],如果該座標所代表的元素值為1,則返回該座標所代表的元素相鄰的所有值為1的元素座標。 解

Java中Map的 entrySet() 以及用法(四種map的方式)

Entry 由於Map中存放的元素均為鍵值對,故每一個鍵值對必然存在一個對映關係。  Map中採用Entry內部類來表示一個對映項,對映項包含Key和Value (我們總說鍵值對鍵值對, 每一個鍵值對也就是一個Entry) Map.Entry裡面包含getKey()和getValue(

目錄漏洞

對於一個安全的Web伺服器來說,對Web內容進行恰當的訪問控制是極為關鍵的。目錄遍歷是Http所存在的一個安全漏洞,它使得攻擊者能夠訪問受限制的目錄,並在Web伺服器的根目錄以外執行命令。   Web伺服器主要提供兩個級別的安全機制: 訪問控制列表——就是我們常說的AC

二叉搜尋樹的插入,刪除,操作

TreeNode* findNodeInSearchBT(TreeNode*root, int k, TreeNode**pa = nullptr) { //這裡是不需要進行null判斷的,因為後面隱式的判斷了是否為null while (root != nullptr) { if (k >