ConcurrentHashMap如何保证线程安全?
JDK7: 分段锁(Segment)
一个大 Map拆成多个小 Map(Segment)
修改时锁的是一段(Segment),不是整个表
JDK 8:CAS + synchronized
先尝试 CAS 插入
如果失败使用 synchronized
ConcurrentHashMap为什么允许null?
答:考虑并发场景
// 线程A
map.put("key", null);
// 线程B
map.remove("key");
如果此时
// 线程C
map.get("key") == null 无法区分是 key 不存在还是 value 本身为 null。