欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java ConcurrentHashMap鎖分段機制使用及代碼實例

 更新時間:2025年01月03日 14:34:03   作者:學亮編程手記  
ConcurrentHashMap是Java中的一種線程安全的哈希表,通過鎖分段機制提高了并發(fā)性能,在Java 8中,ConcurrentHashMap引入了CAS操作和更復雜的節(jié)點繼承結構,進一步優(yōu)化了并發(fā)操作

概述

鎖分段機制ConcurrentHashMap

線程安全的hash表 每一段都是一個獨立的鎖

Java 5.0 在 java.util.concurrent 包中提供了多種并發(fā)容器類來改進同步容器的性能。

ConcurrentHashMap 同步容器類是Java 5 增加的一個線程安全的哈希表。對與多線程的操作,介于 HashMap 與 Hashtable 之間。內部采用“鎖分段”機制替代 Hashtable 的獨占鎖。進而提高性能。

此包還提供了設計用于多線程上下文中的 Collection 實現(xiàn):ConcurrentHashMap、 ConcurrentSkipListMap、 ConcurrentSkipListSet、CopyOnWriteArrayList 和 CopyOnWriteArraySet。當期望許多線程訪問一個給定 collection 時, ConcurrentHashMap 通常優(yōu)于同步的 HashMap,ConcurrentSkipListMap 通常優(yōu)于同步的 TreeMap。當期望的讀數和遍歷遠遠大于列表的更新數時, CopyOnWriteArrayList 優(yōu)于同步的 ArrayList。

ConcurrentHashMap就是一個線程安全的hash表。我們知道HashMap是線程不安全的,Hashtable加了鎖,是線程安全的,因此它效率低。

HashTable加鎖就是將整個hash表鎖起來,當有多個線程訪問時,同一時間只能有一個線程訪問,并行變成串行,因此效率低。所以JDK1.5后提供了ConcurrentHashMap,它采用了鎖分段機制。

1.8以后底層又換成了CAS,把鎖分段機制放棄了。CAS基本就達到了無鎖的境界。

詳解

ConcurrentHashMap 是 Java 中的一個線程安全的哈希表,它在多線程環(huán)境下提供了高效的讀取和更新操作。

從 Java 8 開始,ConcurrentHashMap 引入了一種新的機制,稱為“鎖分段”(Segmentation with Locks),以提高并發(fā)性能。

鎖分段機制詳解

在 Java 8 之前的版本中,ConcurrentHashMap 使用分段鎖(Segmentation with Segments)來實現(xiàn)線程安全。每個段相當于一個小型的哈希表,擁有自己的鎖。當多個線程訪問不同段的數據時,它們可以并發(fā)進行,從而減少了鎖的競爭。

然而,Java 8 引入的鎖分段機制進一步優(yōu)化了這一點。在新的實現(xiàn)中:

  • CAS 操作ConcurrentHashMap 使用了更多的無鎖編程技術,如原子操作(Compare-And-Swap, CAS),來減少鎖的使用。
  • Node 繼承結構:內部結構由 Node、TreeNodeTreeBin 等類組成,這些類繼承自 Node,形成了一個復雜的繼承結構。
  • Synchronized 粒度:在某些操作上,如擴容和部分更新操作上,仍然使用了 synchronized 塊來保證線程安全。
  • 減少鎖的競爭:通過減少鎖的使用,ConcurrentHashMap 允許更高的并發(fā)性,因為線程可以在沒有鎖的情況下進行大部分操作。

示例

下面是一個簡單的 ConcurrentHashMap 使用示例:

import java.util.concurrent.ConcurrentHashMap;

public class ConcurrentHashMapExample {
    public static void main(String[] args) {
        // 創(chuàng)建一個 ConcurrentHashMap 實例
        ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();

        // 插入數據
        map.put("One", 1);
        map.put("Two", 2);
        map.put("Three", 3);

        // 讀取數據
        System.out.println(map.get("Two")); // 輸出 2

        // 并發(fā)更新數據
        for (int i = 0; i < 10; i++) {
            int finalI = i;
            new Thread(() -> map.put("Key" + finalI, finalI)).start();
        }

        // 等待所有線程完成
        while (Thread.activeCount() > 1) {
            Thread.yield();
        }

        // 輸出更新后的數據
        System.out.println(map.get("Key9")); // 輸出 9
    }
}

在這個示例中,我們創(chuàng)建了一個 ConcurrentHashMap 實例,并插入了一些數據。然后,我們啟動了多個線程來并發(fā)地更新數據。

由于 ConcurrentHashMap 是線程安全的,即使在多線程環(huán)境下,這些操作也不會導致數據不一致的問題。

注意事項

  • ConcurrentHashMap 在高并發(fā)環(huán)境下比 HashtableCollections.synchronizedMap 有更好的性能。
  • ConcurrentHashMap 適用于讀多寫少的場景。
  • 在使用 ConcurrentHashMap 時,仍然需要注意避免長時間持有迭代器,因為在迭代過程中可能會有結構性修改(如擴容)。

ConcurrentHashMap 是 Java 并發(fā)包 java.util.concurrent 中的一個重要組件,它通過鎖分段機制提供了高效的并發(fā)訪問能力。

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Spring MVC--攔截器實現(xiàn)和用戶登陸例子

    Spring MVC--攔截器實現(xiàn)和用戶登陸例子

    本文主要介紹了Spring MVC--攔截器實現(xiàn)和用戶登陸例子,具有很好的參考價值,下面跟著小編一起來看下吧
    2017-03-03
  • Java框架Struts2實現(xiàn)圖片上傳功能

    Java框架Struts2實現(xiàn)圖片上傳功能

    這篇文章主要為大家詳細介紹了Java框架Struts2實現(xiàn)圖片上傳功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • Mybatis之如何攔截慢SQL日志記錄

    Mybatis之如何攔截慢SQL日志記錄

    這篇文章主要介紹了Mybatis之如何攔截慢SQL日志記錄問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 2020最新版idea激活教程(推薦)

    2020最新版idea激活教程(推薦)

    這篇文章主要介紹了2020最新版idea激活教程,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • java 線程中start方法與run方法的區(qū)別詳細介紹

    java 線程中start方法與run方法的區(qū)別詳細介紹

    這篇文章主要介紹了java 線程中start方法與run方法的區(qū)別詳細介紹的相關資料,在java線程中調用start方法與run方法的區(qū)別在哪里? 這兩個問題是兩個非常流行的初學者級別的多線程面試問題,這里進行詳細說明,需要的朋友可以參考下
    2016-11-11
  • 百度Java面試題 前200頁精選(上)

    百度Java面試題 前200頁精選(上)

    這篇文章主要為大家分享了Java面試資源,百度“Java面試題”前200頁都在這里了,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • 詳解JAVA 弱引用

    詳解JAVA 弱引用

    這篇文章主要介紹了 JAVA 弱引用的相關資料,幫助大家更好的理解和學習java引用對象,感興趣的朋友可以了解下
    2020-08-08
  • Java實現(xiàn)郵件找回密碼功能

    Java實現(xiàn)郵件找回密碼功能

    這篇文章主要為大家詳細介紹了Java實現(xiàn)郵件找回密碼功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • 通過Maven進行jedis連接redis的實現(xiàn)

    通過Maven進行jedis連接redis的實現(xiàn)

    這篇文章主要介紹了通過Maven進行jedis連接redis的實現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • 深入理解Java中的HashMap的實現(xiàn)機制

    深入理解Java中的HashMap的實現(xiàn)機制

    這篇文章主要介紹了深入理解Java中的HashMap的實現(xiàn)機制,同時也有助于理解Java中對于哈希函數的相關處理方式,需要的朋友可以參考下
    2015-07-07

最新評論