最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java ConcurrentHashMap鎖分段機(jī)制使用及代碼實(shí)例

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

概述

鎖分段機(jī)制ConcurrentHashMap

線程安全的hash表 每一段都是一個(gè)獨(dú)立的鎖

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

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

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

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

HashTable加鎖就是將整個(gè)hash表鎖起來(lái),當(dāng)有多個(gè)線程訪問(wèn)時(shí),同一時(shí)間只能有一個(gè)線程訪問(wèn),并行變成串行,因此效率低。所以JDK1.5后提供了ConcurrentHashMap,它采用了鎖分段機(jī)制。

1.8以后底層又換成了CAS,把鎖分段機(jī)制放棄了。CAS基本就達(dá)到了無(wú)鎖的境界。

詳解

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

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

鎖分段機(jī)制詳解

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

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

  • CAS 操作ConcurrentHashMap 使用了更多的無(wú)鎖編程技術(shù),如原子操作(Compare-And-Swap, CAS),來(lái)減少鎖的使用。
  • Node 繼承結(jié)構(gòu):內(nèi)部結(jié)構(gòu)由 Node、TreeNodeTreeBin 等類組成,這些類繼承自 Node,形成了一個(gè)復(fù)雜的繼承結(jié)構(gòu)。
  • Synchronized 粒度:在某些操作上,如擴(kuò)容和部分更新操作上,仍然使用了 synchronized 塊來(lái)保證線程安全。
  • 減少鎖的競(jìng)爭(zhēng):通過(guò)減少鎖的使用,ConcurrentHashMap 允許更高的并發(fā)性,因?yàn)榫€程可以在沒(méi)有鎖的情況下進(jìn)行大部分操作。

示例

下面是一個(gè)簡(jiǎn)單的 ConcurrentHashMap 使用示例:

import java.util.concurrent.ConcurrentHashMap;

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

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

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

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

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

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

在這個(gè)示例中,我們創(chuàng)建了一個(gè) ConcurrentHashMap 實(shí)例,并插入了一些數(shù)據(jù)。然后,我們啟動(dòng)了多個(gè)線程來(lái)并發(fā)地更新數(shù)據(jù)。

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

注意事項(xiàng)

  • ConcurrentHashMap 在高并發(fā)環(huán)境下比 HashtableCollections.synchronizedMap 有更好的性能。
  • ConcurrentHashMap 適用于讀多寫少的場(chǎng)景。
  • 在使用 ConcurrentHashMap 時(shí),仍然需要注意避免長(zhǎng)時(shí)間持有迭代器,因?yàn)樵诘^(guò)程中可能會(huì)有結(jié)構(gòu)性修改(如擴(kuò)容)。

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

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • EDI中JAVA通過(guò)FTP工具實(shí)現(xiàn)文件上傳下載實(shí)例

    EDI中JAVA通過(guò)FTP工具實(shí)現(xiàn)文件上傳下載實(shí)例

    這篇文章主要介紹了EDI中JAVA通過(guò)FTP工具實(shí)現(xiàn)文件上傳下載實(shí)例,具有一定的參考價(jià)值,有需要的可以了解一下。
    2016-11-11
  • Java設(shè)計(jì)模式中的適配器模式

    Java設(shè)計(jì)模式中的適配器模式

    這篇文章主要介紹了Java設(shè)計(jì)模式中的適配器模式,適配器模式(Adapter Pattern)將某個(gè)類的接口轉(zhuǎn)換成客戶端期望的另一個(gè)接口表示,主的目的是兼容性,讓原本因接口不匹配不能一起工作的兩個(gè)類可以協(xié)同工作。其別名為包裝器
    2022-07-07
  • Java Socket使用加密協(xié)議進(jìn)行傳輸對(duì)象的方法

    Java Socket使用加密協(xié)議進(jìn)行傳輸對(duì)象的方法

    這篇文章主要介紹了Java Socket使用加密協(xié)議進(jìn)行傳輸對(duì)象的方法,結(jié)合實(shí)例形式分析了java socket加密協(xié)議相關(guān)接口與類的調(diào)用方法,以及服務(wù)器、客戶端實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-06-06
  • spring mvc 和ajax異步交互完整實(shí)例代碼

    spring mvc 和ajax異步交互完整實(shí)例代碼

    本篇文章主要介紹了spring mvc 和ajax異步交互完整實(shí)例代碼,簡(jiǎn)單的AJAX+SpringMVC的異步交互小例子,有興趣的可以了解一下。
    2017-02-02
  • ibatis結(jié)合oracle批量插入三種方法的測(cè)評(píng)

    ibatis結(jié)合oracle批量插入三種方法的測(cè)評(píng)

    今天小編就為大家分享一篇關(guān)于ibatis結(jié)合oracle批量插入三種方法的測(cè)評(píng),小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12
  • 一文搞懂?MyBatis的事務(wù)管理機(jī)制

    一文搞懂?MyBatis的事務(wù)管理機(jī)制

    MyBatis是一款優(yōu)秀的持久層框架,相信很多Java后端開(kāi)發(fā)人員對(duì)它都不會(huì)陌生。本文將從事務(wù)概述、MyBatis實(shí)現(xiàn)事務(wù)的方式、事務(wù)實(shí)現(xiàn)源碼分析方面詳細(xì)解析MyBatis的事務(wù)管理機(jī)制,需要的朋友可以參考下
    2023-05-05
  • Java容器類的深入理解

    Java容器類的深入理解

    本篇文章是對(duì)Java容器類進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • SpringBoot Redisson 集成的實(shí)現(xiàn)示例

    SpringBoot Redisson 集成的實(shí)現(xiàn)示例

    本文主要介紹了SpringBoot Redisson 集成的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05
  • 解決Java中new?BigDecimal()的坑

    解決Java中new?BigDecimal()的坑

    這篇文章主要介紹了解決Java中new?BigDecimal()的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Java數(shù)據(jù)結(jié)構(gòu)與算法實(shí)現(xiàn)遞歸與回溯

    Java數(shù)據(jù)結(jié)構(gòu)與算法實(shí)現(xiàn)遞歸與回溯

    本文主要介紹了Java數(shù)據(jù)結(jié)構(gòu)與算法實(shí)現(xiàn)遞歸與回溯,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03

最新評(píng)論

遵义县| 嘉峪关市| 德保县| 温州市| 大化| 汉源县| 汶川县| 北辰区| 青阳县| 长寿区| 乌兰察布市| 抚远县| 西平县| 襄城县| 柘荣县| 武宁县| 永济市| 海原县| 黑水县| 兴安县| 宁乡县| 宁波市| 嘉义市| 固安县| 安国市| 鹤庆县| 康马县| 萍乡市| 徐水县| 墨竹工卡县| 临武县| 巴林右旗| 太保市| 会昌县| 柯坪县| 汝州市| 文化| 新源县| 石狮市| 阿瓦提县| 磐安县|