1. 程式人生 > >ConcurrentHashMap的使用場景以及與HashTable的比較

ConcurrentHashMap的使用場景以及與HashTable的比較

ConcurrentHashMap使用了一種完全不同的加鎖策略來提供更高的併發性和伸縮性。ConcurrentHashMap並不是將每個方法都在同一個鎖上同步並使得每次只有一個執行緒訪問容器,而是使用一種粒度更細的加鎖機制來實現更大程度的共享,這種機制成為分段鎖(lock striping)。這種機制中,任意數量的讀取執行緒都可以併發訪問Map,並且一定數量的執行緒可以併發修改Map。好處是:在併發環境下實現更高的吞吐量。

       在HashTable以及synchronizedMap中,都是通過獲取整個Map的鎖以防止其他執行緒訪問這個Map,但ConcurrentHashMap沒有對整個Map加鎖以提供獨佔訪問。

典型應用場景:

使用map時,需要使用synchronized,這樣計算的併發效能低下

public class Memoizer1 <A, V> implements Computable<A, V> {
    private final Map<A, V> cache = new HashMap<A, V>();
    private final Computable<A, V> c;

    public Memoizer1(Computable<A, V> c) {
        this.c = c;
    }

    public synchronized V compute(A arg) throws InterruptedException {
        V result = cache.get(arg);
        if (result == null) {
            result = c.compute(arg);
            cache.put(arg, result);
        }
        return result;
    }
}
interface Computable <A, V> {
    V compute(A arg) throws InterruptedException;
}

改成使用ConcurrentHashMap
public class Memoizer2 <A, V> implements Computable<A, V> {
    private final Map<A, V> cache = new ConcurrentHashMap<A, V>();
    private final Computable<A, V> c;

    public Memoizer2(Computable<A, V> c) {
        this.c = c;
    }

    public V compute(A arg) throws InterruptedException {
        V result = cache.get(arg);
        if (result == null) {
            result = c.compute(arg);
            cache.put(arg, result);
        }
        return result;
    }
}

進一步的原理分析和比較,可以參考:

http://blog.csdn.net/liuzhengkang/article/details/2916620

http://www.douban.com/note/169672949/

相關推薦

ConcurrentHashMap的使用場景以及HashTable比較

ConcurrentHashMap使用了一種完全不同的加鎖策略來提供更高的併發性和伸縮性。ConcurrentHashMap並不是將每個方法都在同一個鎖上同步並使得每次只有一個執行緒訪問容器,而是使用一種粒度更細的加鎖機制來實現更大程度的共享,這種機制成為分段鎖(lock

Spark四大特性以及MapReduce比較

一、速度 面向磁碟的MapReduce受限於磁碟讀/寫效能和網路I/O效能的約束,在處理迭代計算、實時計算、互動式資料查詢等方面並不高效,但是這些卻在圖計算、資料探勘和機器學習等相關應用領域中非常常見。針對這一不足,將資料儲存在記憶體中並基於記憶體進行計算是一個

Redis使用場景以及memcache的區別

1、Redis使用場景 (1)、會話快取(Session Cache) (2)、全頁快取(FPC) (3)、佇列 (4)、排行榜、計數器 (5)、釋出、訂閱 2、Memcache與Redis的區別有哪些? (1)、儲存方式不同,memcache把所有資料存在記憶

HashMap工作原理以及HashTable的區別--面試題

每當往hashmap裡面存放key-value對的時候,都會為它們例項化一個Entry物件,這個Entry物件就會儲存在前面提到的Entry陣列table中。現在你一定很想知道,上面建立的Entry物件將會存放在具體哪個位置(在table中的精確位置)。答案就是,根據ke

Redis簡介,以及memcache比較

Redis概述 一、memcache的不足之處 1、沒有密碼 2、Memcache是儲存記憶體但是沒有自帶的備份檢測功能。

JUnit手動設計測試方法以及Randoop的自動生成測試的比較

ron config oop unit 使用 例如 布局 意義 nal 手動設計測試 在已有的web project本地目錄lib文件夾裏導入兩個jar文件(版本可不一樣):junit-4.12.jar和hamcrest.jar 打開eclipse,導入項目,右擊項目選擇

srtlen實現以及sizeof的比較

signed 對象 字節 常量 包含 長度 ons 頭文件 object 這裏僅為個人整理,大部分來自百科 一、strlen函數 strlen所作的僅僅是一個計數器的工作,它從內存的某個位置(可以是字符串開頭,中間某個位置,甚至是某個不確定的內存區域)開始掃描,直到碰到第

HashMap底層原理以及ConCurrentHashMap區別

clas put level shm segment 區別 一個 bucket link   HashMap基於hashing原理,我們通過put()和get()方法儲存和獲取對象。當我們將鍵值對傳遞給put()方法時,它調用鍵對象的hashCode()方法來計算hashc

TCPUDP比較 以及並發編程基礎知識

引用 層次 系統調用 指示 核心 () 樹形結構 list 設計 一、tcp比udp真正可靠地原因 1.為什麽tcp比udp傳輸可靠地原因: 我們知道在傳輸數據的時候,數據是先存在操作系統的緩存中,然後發送給客戶端,在客戶端也是要經過客戶端的操作系統的,因為這個過程涉及到

Java基礎教程:HashTableHashMap比較

唯一性 trac 並發 con 元素 散列表 個數 AR 底層 Java基礎教程:HashTable與HashMap比較 1. 關於HashMap的一些說法: a) HashMap實際上是一個“鏈表散列”的數據結構,即數組和鏈表的結合體。HashMap的底層結構是一個數

HashMap、HashtableConcurrentHashMap的原理區別

另一個 cnblogs 需要 構造器 新的 底層 bsp 哈希 fas HashTable 底層數組+鏈表實現,無論key還是value都不能為null,線程安全,實現線程安全的方式是在修改數據時鎖住整個HashTable,效率低,ConcurrentHashMap做了相

hashMap,hashTable,concurrentHashmap的區別 面試必備:HashMap、HashtableConcurrentHashMap的原理區別

轉自  面試必備:HashMap、Hashtable、ConcurrentHashMap的原理與區別 果你去面試,面試官不問你這個問題,你來找我^_^ 下面直接來乾貨,先說這三個Map的區別: HashTable 底層陣列+連結串列實現,無論key還是value都不能為null,執行

xml方式excel、以及jxl方式匯出效能比較

通過xml方式匯出excel沒有65536資料條數限制,於是嘗試了一下,具體程式碼如下: private static int maxRow = 1000000; /** * 通過xml方式寫入文件匯出excel檔案 * @param shee

分表分庫使用場景以及設計方式

一. 分表       場景:對於大型的網際網路應用來說,資料庫單表的記錄行數可能達到千萬級甚至是億級,並且資料庫面臨著極高的併發訪問。採用Master-Slave複製模式的MySQL架構, 只能夠對資料庫的讀進行擴充套件,而對資料庫的寫入操作還是集中在Master上,並

面試必備:HashMap、HashtableConcurrentHashMap的原理區別

如果你去面試,面試官不問你這個問題,你來找我^_^ 下面直接來乾貨,先說這三個Map的區別: HashTable 底層陣列+連結串列實現,無論key還是value都不能為null,執行緒安全,實現執行緒安全的方式是在修改資料時鎖住整個HashTable,效率低,Conc

HashTable、HashMap、ConcurrentHashMap的原理區別

希望各位小夥伴能帶著如下幾個問題來進行閱讀,這樣收穫會更大。 1.HashTable、HashMap、ConcurrentHashMap的區別? 2.HashMap執行緒不安全的出現場景? 3.HashMap put方法存放資料時是怎麼判斷是否重複的? 4.JD

gmap,以及sync.Map的效能比較

gf框架提供了幾個非常實用的併發安全容器,其中gmap就是專案開發中最常用的一個。 從執行效率上考慮,基於不同的需求場景,選擇合適的型別結構體,其執行效率是不一樣的,以下使用基準測試來對比各個型別的寫入效能(測試程式碼): john@johnstation:~/Wor

移動端適配以及百分比佈局rem比較

前言 對於熟悉pc端的小夥伴來說,對於靜態頁面的佈局,一般都是沒有什麼問題的,為了保持各瀏覽器顯示的一致性,無論是選擇優雅降級還是漸進增強,我們有時不得不做相容性處理,比如css中的hack技術,css3中新增屬性新增一些瀏覽器字首等,但在移動端對h5新增的屬性都比較友好,

JAVA的動態代理模式分析以及spring AOP的比較

本文是結合《輕量級Java EE企業應用實戰(李剛)》這本書以及個人的一點理解寫的,記錄下來以作學習之用。 1.代理就是一個java物件代表另一個java物件來採取行動。為什麼需要採用代理呢?很簡單,就是在某些情況下,客戶端程式碼不想或者是不能直接呼叫被呼叫者,這時候代理物

Jetty 的工作原理以及 Tomcat 的比較

Jetty 目前的是一個比較被看好的 Servlet 引擎,它的架構比較簡單,也是一個可擴充套件性和非常靈活的應用伺服器,它有一個基本資料模型,這個資料模型就是 Handler,所有可以被擴充套件的元件都可以作為一個 Handler,新增到 Server 中,Jetty 就是幫你管理這些 Handler。