ConcurrentHashMap

ConcurrentHashMap 同步容器类是 Java 5 增加的一个线程安全哈希表。对与多线程的操作,介于 HashMap 与 Hashtable 之间。内部采用“锁分段”机制替代 Hashtable 的独占锁。进而提高性能。

jdk8 弃用了分段锁,使用 cas+synchronized

放弃分段锁的原因:

1.加入多个分段锁浪费内存空间

2.生产环境中,map 在放入时竞争同一个锁的概率非常小,分段锁反而会造成更新等操作的长时间等待。

jdk8 放弃了分段锁而是用了 Node 锁,减低锁的粒度,提高性能,并使用 CAS 操作来确保 Node 的一些操作的原子性,取代了锁。

实现原理 :

put 时首先通过 hash 找到对应链表过后,查看是否是第一个 Node,如果是,直接用 cas 原则插入,无需加锁。

然后, 如果不是链表第一个 Node, 则直接用链表第一个 Node 加锁,这里加的锁是 synchronized。ConcurrentHashMap 不支持存储 null 键和 null 值。(为了消除歧义 )

ConcurrentHashMap 不能 put null 是因为 无法分辨是 key 没找到的 null 还是有 key 值为 null,这在多线程里面是模糊不清的,所以压根就不让 put null。

ConcurrentHashmap 和 Hashtable 都是支持并发的,这样会有一个问题,当你通过 get(k)获取对应的 value 时,如果获取到的是 null 时,你无法判断,它是 put(k,v)的时候 value 为 null,还是这个 key 从来没有做过映射。

你可能感兴趣的:(面经,并发编程,笔试笔记,开发语言,java)