1_基础知识_chapter05_基础构建模块_1_同步容器类

本文探讨了线程安全类的创建策略,重点讨论了同步容器类如Vector和HashTable的线程安全特性及其在复合操作时的问题。文章还分析了迭代器在多线程环境下可能引发的并发修改异常,并提出了通过加锁或克隆容器来避免此类问题的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 委托是创建线程安全类的一个最有效的策略, 只需让现有的线程安全类管理所有的状态即可

  • Collections.synchronizedXXX是一些同步容器类, 这些类的实现方式是将它们的状态封装起来, 并且对每个公有方法都进行同步

  • 同步容器类包括 Vector, HashTable, Collections.synchronizedXXX

  • 同步容器类的问题

    (1) 同步容器类是线程安全的, 但是在执行复合操作时仍需要客户端加锁

    复合操作有:

    迭代

    跳转(根据指定顺序找到当前元素的下一个元素)

    条件运算(若容器中不存在某个元素, 则添加这个元素)

示例

    public class SafeVectorHelpers {
    
        public static Object getLast(Vector list) {
    
            int lastIndex = list.size() - 1;
            return list.get(lastIndex);
        }

        public static void deleteLast(Vector list) {
    
            int lastIndex = list.size() - 1;
            list.remove(lastIndex);
        }
    }

当有两个线程分别对同一个Vector容器执行getLast和deleteLast函数时, 一个执行完get(),另一个执行remove就会报错

(2) 为了保证复合操作的线程安全性就要加锁, 此时符合"客户端加锁"的条件:找到同步容器使用了哪一个锁,并对它加锁
  • 迭代器的迭代问题

    (1) 无论显式用迭代器迭代还是用for-each语法, 本质都是使用Iterator迭代

    (2) 容器使用了及时失败机制: 当发现容器在迭代过程中被外部更改或其他线程更改时, 报ConcurrentModification异常

    (3) 防止容器报ConcurrentModification异常的手段

    加锁

    先克隆容器, 再在克隆容器上迭代(克隆过程也要加锁)

    两种手段都会使性能下降, 综合考虑各种因素才能比较出两种手段在不同场合下的优劣

    (3) 隐藏迭代器

    很多时候方法内部也使用了迭代, 但是隐藏了起来, 这时不注意的话就有多线程迭代异常的问题

    示例

      public class HiddenIterator {
    
          @GuardedBy("this")
          private final Set<Integer> set = new HashSet<Integer>();
    
          public synchronized void add(Integer i) {
              set.add(i);
          }
    
          public synchronized void remove(Integer i) {
              set.remove(i);
          }
    
          public void addTenThings() {
    
              Random r = new Random();
    
              for (int i = 0; i < 10; i++) {
                  this.add(r.nextInt());
              }
    
              System.out.println(this.set);
          }
      }
    

    这里的addTenThings函数的最后一行System.out.println(this.set)会隐式调用set的迭代器, 将set中的所有元素转换为String, 如果此时其他线程调用了add或remove函数, 就会出现迭代异常

内容概要:该研究通过在黑龙江省某示范村进行24小时实地测试,比较了燃煤炉具与自动/手动进料生物质炉具的污染物排放特征。结果显示,生物质炉具相比燃煤炉具显著降低了PM2.5、CO和SO2的排放(自动进料分别降低41.2%、54.3%、40.0%;手动进料降低35.3%、22.1%、20.0%),但NOx排放未降低甚至有所增加。研究还发现,经济性和便利性是影响生物质炉具推广的重要因素。该研究不仅提供了实际排放数据支持,还通过Python代码详细复现了排放特征比较、减排效果计算和结果可视化,进一步探讨了燃料性质、动态排放特征、碳平衡计算以及政策建议。 适合人群:从事环境科学研究的学者、政府环保部门工作人员、能源政策制定者、关注农村能源转型的社会人士。 使用场景及目标:①评估生物质炉具在农村地区的推广潜力;②为政策制定者提供科学依据,优化补贴政策;③帮助研究人员深入了解生物质炉具的排放特征和技术改进方向;④为企业研发更高效的生物质炉具提供参考。 其他说明:该研究通过大量数据分析和模拟,揭示了生物质炉具在实际应用中的优点和挑战,特别是NOx排放增加的问题。研究还提出了多项具体的技术改进方向和政策建议,如优化进料方式、提高热效率、建设本地颗粒厂等,为生物质炉具的广泛推广提供了可行路径。此外,研究还开发了一个智能政策建议生成系统,可以根据不同地区的特征定制化生成政策建议,为农村能源转型提供了有力支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值