原文:https://blog.csdn.net/yue_hu/article/details/80065250
多线程模式下,普通的HashMap或者HashSet存在线程安全性问题,可能出现多个线程同时对一个节点进行操作的现象。此外,多线程下是可能出现一个线程在遍历一个线程却在操作(写或者删除的事情)的情况,为了避免这种情况concurrent报下也提供了对应的类。concurrent共提供了5个类,分别为:
ConcurrentHashMap 线程安全的Map
ConcurrentSkipListMap 线程安全且具有排序功能的Map
ConcurrentSkipListSet 线程安全且具有排序功能的Set
CopyOnWriteArrayList 线程安全能够在遍历的过程中对List进行操作(包括写和删除)
CopyOnWriteArraySet 线程安全能够在遍历的过程中对Set进行操作(包括写和删除)
而这些类也提供的一个独特的入参:concurrencyLevel:并发级别。传入预估有多少个线程会同时访问这个Map
除此之外还有一些通用的参数:
size:表示HashMap中存放KV的数量(为链表和树中的KV的总和)。capacity:译为容量。capacity就是指HashMap中桶的数量。默认值为16。每次扩充都是乘以2倍。
loadFactor:译为装载因子。装载因子用来衡量HashMap满的程度。loadFactor的默认值为0.75f。计算HashMap的实时装载因子的方法为:size/capacity,而不是占用桶的数量去除以capacity。
threshold:threshold表示当HashMap的size大于threshold时会执行resize操作。 threshold=capacity*loadFactor 这个值是不能设置的 通过capacity和loadFactor自动生成
Map中还提供了通用方法之外的额外的方法:
①:putIfAbsent:
if (!map.containsKey(key))
return map.put(key, value);else
return map.get(key);
②:replace(K key, V oldValue, V newValue)
if (map.containsKey(key) && map.get(key).equals(oldValue)) {
map.put(key, newValue);
return true;
}
else
return false;
③:replace(K key, V value)
if (map.containsKey(key)) {
return map.put(key, value);
} else return null;