JDK中concurrent包下的线程安全集合

原文:https://blog.csdn.net/yue_hu/article/details/80065250

Java入门在线学习,学不会退款。

多线程模式下,普通的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;

猜你喜欢

转载自blog.csdn.net/baidu_38868875/article/details/89530617