zoukankan      html  css  js  c++  java
  • java中线程安全的集合

    一、CopyOnWriteArrayList

    迭代的同时进行修改会发生ConcurrentModificationException异常,推荐使用CopyOnWriteArrayList

    List<RtuTagAct> rtuTagActList = entry.getValue();
    for (RtuTagAct rtuTagAct:rtuTagActList) {
         if (rtuTagAct.getTagKey().equals(pushKey)) {
             rtuTagActList.remove(rtuTagAct);
                    }
                }

    下面是修改后的实现

    List<RtuTagAct> rtuTagActList0 = entry.getValue();
    List<RtuTagAct> rtuTagActList = new CopyOnWriteArrayList<>(rtuTagActList0);
    for (RtuTagAct rtuTagAct:rtuTagActList) {
        if (rtuTagAct.getTagKey().equals(pushKey)) {
            rtuTagActList.remove(rtuTagAct);
                    }
                }

    二、ConcurrentHashMap

    并发时修改Map,推荐使用ConcurrentHashMap,不然可能发生不可预料的后果

    比如如下实现,算出的数据根本就是错误的

    Map<String, Double> result = new HashMap<>();
    atIdList.forEach(meterId -> {
                Double now = rtValueMap.get(meterId); 
                Double node = hiveRTValueMap.get(meterId);
                double todayValue = ArithUtils.sub(now, node);
                 result.put(meterId, todayValue);  
                }
            });

    采用如下修改后的代码,果然就没问题了

    Map<String, Double> result = new ConcurrentHashMap<>();
    atIdList.forEach(meterId -> {
                Double now = rtValueMap.get(meterId); 
                Double node = hiveRTValueMap.get(meterId);
                double todayValue = ArithUtils.sub(now, node);
                 result.put(meterId, todayValue);  
                }
            });

    三、 其他

    interfacenon-thread-safethread-safe
    List ArrayList CopyOnWriteArrayList
    Map HashMap ConcurrentHashMap
    Set HashSet / TreeSet CopyOnWriteArraySet
    Queue ArrayDeque / LinkedList ArrayBlockingQueue / LinkedBlockingQueue
    Deque ArrayDeque / LinkedList LinkedBlockingDeque
  • 相关阅读:
    Apache Common-IO 使用
    Apache Compress-使用
    使用JavaConfig方式-Spring 基础学习
    设计模式-策略模式
    logback mybatis 打印sql语句
    oracle 迭代查询
    使用 Dom4j 将 XML 转换为 MAP
    Java连接Access数据库的那些坑
    如何从Maven中央存储库下载?
    sublime构建各个编译环境
  • 原文地址:https://www.cnblogs.com/wangbin2188/p/14781592.html
Copyright © 2011-2022 走看看