public class HashMapDemo {
/*
HashMap是线程不安全的,不能并发操作的
ConcurrentModificationException 并发修改异常 遍历集合,并删除集合中的数据
Hashtable 是线程安全的 public synchronized V put(K key, V value)-->独占锁
锁直接加到了put方法上,锁粒度比较大,效率比较低
用在低并发情况下可以
Map<String,Integer> map = Collections.synchronizedMap(new HashMap<>());
ConcurrentHashMap
*/
public static void main(String[] args) {
ConcurrentHashMap<String,Integer> map = new ConcurrentHashMap<>();
//模拟多个线程对其操作
for (int i = 0; i < 20; i++) {
new Thread(
()->{
map.put(Thread.currentThread().getName(), new Random().nextInt());
System.out.println(map);
}
).start();
}
}
}
ConcurrentHashMap采用锁分段机制,并没有将整个hash表锁住, jdk8之后没有使用分段锁(给每个位置创建一个锁标志对象).
采用的是CAS思想+synchronized来实现
插入是,检测hash表对应位置是否是第一个节点, 如果是采用CAS机制(循环检查) 向第一个位置插入数据.
如果此位置已经有值,那么就以第一个Node对象为锁标志进行加锁,使用的是synchronized实现.
Hashtable则使用了独占锁的机制,虽然是线程安全的,但是效率较低。