Java并发23:ConcurrentHashMap原理 - 线程安全的HashMap
HashMap的线程安全问题 Map<String, String> map = new HashMap<>(); // 多线程并发put map.put("key1", "value1"); // 线程1 map.put("key2", "value2"); // 线程2 // 问题1:数据丢失 // 问题2:死循环(JDK 7) // 问题3:数据覆盖 三种解决方案: // 方案1:Hashtable(废弃) Map<String, String> map = new Hashtable<>(); // synchronized,性能差 // 方案2:Collections.synchronizedMap Map<String, String> map = Collections.synchronizedMap(new HashMap<>()); // 性能差 // 方案3:ConcurrentHashMap(推荐) Map<String, String> map = new ConcurrentHashMap<>(); // 高性能 JDK 7实现:分段锁 核心思想:将Map分成多个Segment,每个Segment独立加锁 ConcurrentHashMap ├─ Segment[0] (ReentrantLock) │ ├─ HashEntry[0] │ ├─ HashEntry[1] │ └─ ... ├─ Segment[1] (ReentrantLock) │ ├─ HashEntry[0] │ └─ ... └─ ... 优点:降低锁粒度,提高并发度 缺点: ...