当前位置:   article > 正文

ConcurrentHashMap介绍及代码示例_concurrenthashmap例子

concurrenthashmap例子

ConcurrentHashMap介绍

java.util.concurrent.ConcurrentHashMap(简称CHM)是Java并发编程工具包中的一个线程安全且高性能的哈希表实现。它允许在多线程环境下并发读写操作,而无需外部同步控制。相较于传统的Hashtable,它的优势在于更高的并发性能,因为它采用了分段锁(Segment Lock)的设计,也称为分段并发控制(Segmented LRU)。这意味着不是在整个表上加锁,而是将表分成多个段(segments),对每一个段独立加锁,这样在多线程环境下,不同段之间可以并发执行读写操作。

在Java 1.8版本以后,ConcurrentHashMap进行了较大的优化,摒弃了原有的Segment设计,改为采用CAS算法配合 synchronized 来保证并发更新的安全性,并且同样引入了红黑树来优化链表过长的情况。

使用场景

  • 多线程环境下的数据共享:在需要多个线程同时读写同一份数据,且数据以键值对形式存储时,使用ConcurrentHashMap能避免由于线程安全问题导致的数据不一致或死锁现象。
  • 缓存系统:作为高速缓存存储结构,ConcurrentHashMap支持自动调整大小以及快速插入、删除和查找操作,适合构建LRU(最近最少使用)等缓存策略。
  • 多线程计数器:在需要统计并发事件次数的场景下,ConcurrentHashMap可以通过原子操作增加或减少计数值。

代码示例

以下是一个简单的ConcurrentHashMap使用示例:

import java.util.concurrent.ConcurrentHashMap;

public class ConcurrentHashMapExample {
    private ConcurrentHashMap<String, Integer> concurrentMap = new ConcurrentHashMap<>();

    // 插入数据
    public void putKeyValuePair(String key, int value) {
        concurrentMap.put(key, value);
    }

    // 获取数据
    public Integer getValue(String key) {
        return concurrentMap.get(key);
    }

    // 更新数据(若key已存在,则更新;否则插入)
    public void putIfAbsent(String key, int newValue) {
        concurrentMap.putIfAbsent(key, newValue);
    }

    // 并发增加计数
    public void incrementCount(String key) {
        concurrentMap.compute(key, (k, v) -> v == null ? 1 : v + 1);
    }

    public static void main(String[] args) {
        ConcurrentHashMapExample example = new ConcurrentHashMapExample();
        
        // 同时在多个线程中操作同一个ConcurrentHashMap
        Runnable task = () -> {
            for (int i = 0; i < 1000; i++) {
                String threadName = Thread.currentThread().getName();
                example.incrementCount(threadName);
            }
        };

        // 创建并启动两个线程
        Thread t1 = new Thread(task);
        Thread t2 = new Thread(task);

        t1.start();
        t2.start();

        // 等待两个线程完成任务
        try {
            t1.join();
            t2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 输出每个线程的名字及其对应的计数
        for (String key : example.concurrentMap.keySet()) {
            System.out.println("Thread: " + key + ", Count: " + example.concurrentMap.get(key));
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57

上述示例展示了如何创建和使用ConcurrentHashMap,包括插入、获取、使用putIfAbsent方法防止重复添加以及使用compute方法并发递增计数。在main方法中,我们创建了两个线程,它们都在同一个ConcurrentHashMap上调用了incrementCount方法,以展示其在多线程环境下的并发安全性。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/996195
推荐阅读
相关标签
  

闽ICP备14008679号