zoukankan      html  css  js  c++  java
  • Java并发编程--并发容器之Collections

      在JDK1.2之前同步容器类包括Vector、Hashtable,这两个容器通过内置锁synchronized保证了同步。后面的ArrayList、LinkedList、HashMap、LinkedHashMap等等都不是线程安全的,没有添加同步机制。但是JDK后面的Collections类也提供了这些常见容器类的同步容器类实现:将它们的状态封装起来,并对每个公共方法都进行同步,使得每次只有一个线程能访问容器状态

      在Collections这个类下面提供了一些静态类和静态方法。比如常见的同步容器类的创建方法:

    1 public static <T> List<T> synchronizedList(List<T> list);
    2 
    3 public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m);
    4 
    5 public static <T> Set<T> synchronizedSet(Set<T> s);
    6 
    7 public static <K,V> SortedMap<K,V> synchronizedSortedMap(SortedMap<K,V> m);
    8 
    9 .....

      通过这些静态方法将一个传递进去的集合包装成同步的集合。这里很明显就用到了设计模式中的装饰器模式。

      Collections同步容器类迭代的线程安全:

        如果同步容器类的数据量很大,迭代的时候占用时间较长。迭代过程中可能会出现别的线程修改了容器的数据,这样迭代的时候可能会抛出异常(比如迭代到索引最后的元素,这时候另外一个线程删除了这个元素,这时候会抛出数组越界的异常)。

        但是如果迭代过程中加锁,那么就会出现性能问题。其中一种解决方案就是克隆容器,再迭代克隆的容器。(克隆期间需要加锁),但是克隆也是耗费CPU性能的。所以没有十全十美的办法。

  • 相关阅读:
    地图 SDK 系列教程-在地图上展示指定区域
    [奇思妙想]下一个和微博、微信同级别的应用为是什么样的
    [办公自动化]EXCEL不大,但是保存很慢
    [奇思妙想]公共图书馆+快递
    [奇思妙想]“停哪了”
    [IT学习]阿铭Linux 微信公众号 每日一题 解析
    [IT学习]GIT 学习
    [故障处理]西部数据wd elements xp 无法识别
    [奇思妙想]无人机
    [IT学习]跟阿铭学linux(第3版)
  • 原文地址:https://www.cnblogs.com/qjjazry/p/6581697.html
Copyright © 2011-2022 走看看