面試題:ConcurrentHashMap實現線程安全的原理
在ConcurrentHashMap沒有出現以前,jdk使用hashtable來實現線程安全,但是hashtable是將整個hash表鎖住,所以效率很低下。
ConcurrentHashMap將數據分別放到多個Segment中,默認16個,每一個Segment中又包含了多個HashEntry列表數組,
對於一個key,需要經過三次hash操作,才能最終定位這個元素的位置,這三次hash分別為:
- 對於一個key,先進行一次hash操作,得到hash值h1,也即h1 = hash1(key);
- 將得到的h1的高幾位進行第二次hash,得到hash值h2,也即h2 = hash2(h1高幾位),通過h2能夠確定該元素的放在哪個Segment;
- 將得到的h1進行第三次hash,得到hash值h3,也即h3 = hash3(h1),通過h3能夠確定該元素放置在哪個HashEntry。
每一個Segment都擁有一個鎖,當進行寫操作時,只需要鎖定一個Segment,而其它Segment中的數據是可以訪問的。
面試題:ConcurrentHashMap實現線程安全的原理
相關推薦
面試題:ConcurrentHashMap實現線程安全的原理
tab 其它 安全 segment nth htable 一個 需要 鎖定 在ConcurrentHashMap沒有出現以前,jdk使用hashtable來實現線程安全,但是hashtable是將整個hash表鎖住,所以效率很低下。 ConcurrentHashMap將數據
ConcurrentHashMap實現線程安全的原理
訪問 數據 key 出現 擁有 操作 tab htable segment 在ConcurrentHashMap沒有出現以前,jdk使用hashtable來實現線程安全,但是hashtable是將整個hash表鎖住,所以效率很低下。 ConcurrentHashMap將數據
Boost中實現線程安全
pen {} blank tex con sleep href ++ for 博客轉載自: http://www.cnblogs.com/lvdongjie/p/4447142.html 1 boost原子變量和線程 #include <boost/thread.h
Java多線程(二) —— 線程安全、線程同步、線程間通信(含面試題集)
err 線程等待 共同點 -c java多線 能夠 空間 而不是 不一致 一、線程安全 多個線程在執行同一段代碼的時候,每次的執行結果和單線程執行的結果都是一樣的,不存在執行結果的二義性,就可以稱作是線程安全的。 講到線程安全問題,其實是指多線程環境下對共享資源的訪問可能會
Java面試題-線程安全
通過 釋放 運行時 ica work 面試題 條件 同時 strong 1. 什麽叫線程安全?servlet是線程安全嗎? 答:如果你的代碼所在的進程中有多個線程在同時運行,而這些線程可能會同時運行這段代碼。如果每次運行結果和單線程運行的結果是一樣的,而且其
.NET面試題系列(五)數據結構(Array、List、Queue、Stack)及線程安全問題
種類型 增刪 叠代器 鎖機制 時間 AS aop 不同 obj 集合 1. Array(數組): 分配在連續內存中,不能隨意擴展,數組中數值類型必須是一致的。數組的聲明有兩種形式:直接定義長度,然後賦值;直接賦值。 缺點:插入數據慢。 優點:性
hibernate中session線程安全的實現
hibernate中的session session的線程安全 threadlocal模式 在hibernate中session是使用ThreadLocal實現線程安全的。ThreadLocal並不是一個Thread,而是一個線程副本,ThreadLocal為每個使用該變量的線程提供一個變量副本,
015 CONTEXT 線程安全上鎖 代碼實現
安全 windows.h lpar hand 代碼實現 void infinite tip process #define UNICODE #include <stdio.h> #include <tchar.h> #include <win
一個隊列類的實現(比delphi自帶的速度快70倍)(線程安全版本)
initial unlock use for in 線程 self. private aps 自帶 unit sfContnrs; interface {$DEFINE MULTI_THREAD_QUEUE} //線程安全版本,如果不需要線程安全,請註釋掉此行代碼 {
線程池原理及實現
任務隊列 批量 not alt con 成了 代碼 pla extends 1、線程池簡介: 多線程技術主要解決處理器單元內多個線程執行的問題,它可以顯著減少處理器單元的閑置時間,增加處理器單元的吞吐能力。 假設一個服務器完成一項任務所需時間為:T1
雙重檢查鎖實現單例模式的線程安全問題
多線程 urn blog 內存 http 代碼 地方 gets 技術博客 一、結論 雙重校驗鎖的單例模式代碼如下: public class Singleton { private static Singleton singleton; private Singl
線程池原理及python實現
source 實例 以及 代碼 let range python實現 queue 上界 https://www.cnblogs.com/goodhacker/p/3359985.html 為什麽需要線程池 目前的大多數網絡服務器,包括Web服務器、Email服務器以
簡單學習ConcurrentHashMap實現執行緒安全的原理
提到多執行緒肯定想到資料的執行緒安全問題如何解決,util包中的Hashtable,Vector都是執行緒安全的,最初的時候也都會選擇這幾種資料儲存方式,在前幾年面試的時候也經常會被問到Hashtable與HashMap,Vector和ArrayList的區
atomic是絕對的線程安全麽?為什麽?如果不是,那應該如何實現?
self. 實現 per ted mic 屬性 安全性 apple prop atomic不是絕對的線程安全。atomic的本意是指屬性的存取方法是線程安全的,並不保證整個對象是線程安全的 @property (atomic, assign) in
單例模式和線程安全
tac 可能 存在 版本 線程不安全 廣東 多線程 一個 單例 前幾天給項目的省市區加了redis。結果上線沒多久就發生了數據錯亂的現象,需要讀取山東省的市可能返回的市廣東的。一開始不明白哪裏有問題,因為測試組的同學有測試過,在測試過程種並沒有發生這樣的情況。由於使用了se
notify,wait,synchronized實現線程間通知
java take 計數器 釋放 com 測試結果 con 最大 runnable wait阻塞線程釋放鎖;notify使wait所在的線程被喚醒在次獲得鎖,並執行,但要等到notify所在的線程代碼全部執行後! 示例代碼如下: package com.vhbi.serv
Servlet的線程安全
包含成員 獨立 i++ add java 方式 為什麽 syn ont Servlet的線程安全 一、什麽是Servlet的線程安全 1.在Servlet的整個生命周期中,構造方法只被執行一次。也就是說,在Servlet的整個生命周期中,只存在一個Servlet實例對象
Java線程安全 關於原子性與volatile的試驗
har length rgs 無法 over pub boolean 即使 dex 1. 變量遞增試驗 1 static /*volatile*/ int shared=0;//volatile也無法保證++操作的原子性 2 static synchr
Spring單例與線程安全小結
null 存在 sta 發的 壓力 _for 處理方式 好處 common 轉:http://www.cnblogs.com/doit8791/p/4093808.html 一、Spring單例模式與線程安全 Spring框架裏的bean,或者說組件,獲取實例的時候
Servlet 線程安全
決定 servlet實例 技術分享 增加 mode 屬性 變量的作用域 引擎 意義 普通類的靜態屬性,當被多個線程訪問時,就有線程安全問題: Servlet 也一樣 當多個客戶端並發訪問同一個Servlet時,web服務器會為每一個客戶端的訪問請求創建一個線程,