HashMap
HashMap是散列表存储,采用key-value键值对存储数据,其中k用hash散列函数找到存储位置,为的就是减少查找比较次数,特点: 无序,key不可重复,key可以为null,value可重复,线程不安全.JDK1.7底层是采用数组+链表,hash碰撞后采用拉链法来解决碰撞问题.JDK1.8底层采用数组+链表+红黑树,链表长度大于等于8且容量大于等于64就会树化,否则会反树化.
案例代码
public class HashMapConcurrentDemo {
public static void main(String[] args) {
Map<String,String> list = new HashMap<>();
for (int i = 0; i < 30
; i++) {
new Thread(()->{
list.put(Thread.currentThread().getName(),UUID.randomUUID().toString().substring(0,8));
System.out.println(list);
},"t"+i).start();
}
}
}
导致原因
高并发情况下,多个线程竞争put操作
解决方案
- Collections.synchronizedMap
底层是采用synchronized同步代码块,包装了最外层的put方法,让其线程安全,其实真正的put操作还是HashMap自己来实现.
- ConcurrentHashMap
底层是采用分段锁来保证线程安全,其中有CAS乐观锁,和synchronized同步代码块来保证线程安全