ConcurrentHashMap
# ConcurrentHashMap
# 1.ConcurrentHashMap对比
HashMap多线程环境下不安全;而HashTable通过synchronized保证线程安全,但是它的锁粒度比较大,是一个全表锁,因此效率会比较低。
两者区别在于①继承父类不同②HashMap扩容时是原来的两倍;而HashTable扩容时容量变为原来的两倍加一。③HashMap解决冲突时节点数量小于8则用链表解决,大于等于8则用红黑树进行存储,小于6时由转化为链表存储;而HashTable解决冲突都是以链表方式进行存储。
# 2.JDK7与8的区别
ConcurrentHashMap在JDK1.7下使用的是分段锁机制,一个ConcurrentHashMap下维护一个segment数组,每个segment下都有一个HashMap链表并继承ReentrantLock可重入锁。写操作put()时只需要锁住当前Segment不会影响到其它的段,而对于读操作get()则不需要加锁,因为具体的值都是使用volatile来修饰的。缺点在于定位一个数据需要两次hash,第一次先找到该数据所在的Segment,然后再定位在链表中的位置。
而JDK1.8下则是使用跟HashMap一样的数据结构,维护一个Node数据,冲突时根据该节点长度来扩展为链表或者是红黑树。控制并发的方式是使用synchronized+CAS,这里sychronized不同于HashTable,它只锁住Node节点链表头,只要没有Node节点哈希冲突就不会产生并发问题。
# 3.computeIfAbsen
computeIfAbsen方法用于获取key对应value,同时合并首次获取不到执行key插入的操作。
String[] map = concurrentHashMap.computeIfAbsent(strategyId, key -> new String[RATE_TUPLE_LENGTH]);
1
编辑 (opens new window)
上次更新: 2023/12/15, 15:49:57