HashMap在多线程环境下操作不安全,在java.util.concurrent包下,提供了ConcurrentHashMap类,保证了HashMap操作安全
不推荐使用Hashtable:
它相当于给整个哈希表加了一把大锁,只要有一个线程访问,其他线程只能阻塞等待,并发性很差
Collections.synchronizedMap也不够好,它本质也是对HashMap进行全表锁,并发性也不好
JDK1.7的ConcurrentHashMap 采用了分段锁策略,将一个 HashMap 切割成 Segment 数组,其中 Segment 可以看成一个 HashMap, 不同点是 Segment 继承自 ReentrantLock,在操作的时候给 Segment 赋予了一个对象锁,从而保证多线程环境下并发操作安全。
JDK1.7和JDK1.8对ConcurrentHashMap和HashMap实现的区别:
JDK1.8对HashMap的改造:当冲突链表长度大于8时,会将链表转变成红黑树结构
ConcurrentHashMap:
JDK1.7:采用分段锁的策略
JDK1.8:采用CAS+synchronized操作来保证并发的安全性