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 >