范例1:
package com.contoso;
import java.util.Random;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ConcurrentHashMapExample1 {
/**
* ConcurrentHashMap的并发访问.
*
* ConcurrentHashMap使用的是区间(或称分段)锁,锁定它里面存储的全部键-值对
*
* 区间锁通过几个锁来划分被保护的区域
*
* - 不需要抛ConcurrentModificationException
*
* - ConcurrentHashMap的size() 和 isEmpty() 可能是不正确的, 不要信赖它们
*
* - ConcurrentHashMap支持原子操作, 不需要客户端锁定
*
* - 读取数据可以并发访问ConcurrentHashMap, 它的迭代器具有弱一致性
*
* - 只有少数几个写操作可以同时修改ConcurrentHashMap
*/
public static void useConcurrentHashMap() {
System.out.println("=== ConcurrentHashMap ===");
ExecutorService executor = Executors.newCachedThreadPool();
Random random = new Random();
ConcurrentHashMap map = new ConcurrentHashMap();
// putIfAbsent是原子操作
// 如果key对应的值value不存在就put,且返回null;
// 如果key对应的值value已存在,则返回已存在的值,且value不能为null,否则会报空指针异常。
map.putIfAbsent(UUID.randomUUID(), random.nextInt(50));
// 模拟并发访问 - 插入不重复的键-值对
for (int i = 0; i < 100; i++) {
if (i % 3 == 0) {
// 写操作
executor.execute(() -> {
UUID key = UUID.randomUUID();
Integer value = random.nextInt(100);
System.out.println("Write " + key + " : " + value);
map.putIfAbsent(key, value);