1.8之前使用 Segment 分段锁实现,效率没新版高,不做讨论
- JDK1.8中仍然存在Segment这个类是为了兼容之前的版本序列化而存在的。
1.8之后使用 synchronized+CAS
- ConcurrentHashMap保证线程安全主要有三个点
- 一、使用volatile保证当Node中的值变化时对于其他线程是可见的
transient volatile Node<K,V>[] table; static class Node<K,V> implements Map.Entry<K,V> { final int hash; final K key; volatile V val; volatile Node<K,V> next; }
- 二、当头结点为null时,使用CAS操作来保证 Node头节点 能被能正确的写入。
- 三、使用table数组的头结点作为synchronized的锁来保证写操作的安全