孝感58同城网站建设,免费的项目管理软件,如何建设一个彩票网站,天津seo网络营销ConcurrentHashMap 同步容器类是 Java 5 增加的一个线程安全的哈希表。对与多线程的操作#xff0c;介于 HashMap 与 Hashtable 之间。内部采用“锁分段”机制替代 Hashtable 的独占锁。进而提高性能。 jdk8 弃用了分段锁#xff0c;使用 cassynchronized 放弃分段锁的原因介于 HashMap 与 Hashtable 之间。内部采用“锁分段”机制替代 Hashtable 的独占锁。进而提高性能。 jdk8 弃用了分段锁使用 cassynchronized 放弃分段锁的原因
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 时你无法判断它是 putk,v的时候 value 为 null还是这个 key 从来没有做过映射。