Java中线程安全集合的使用小结
2013-05-29 10:37
288 查看
线程安全的集合包含2个问题
1.多线程并发修改一 个 集合 怎么办?
2.如果迭代的过程中 集合 被修改了怎么办?
a.一个线程在迭代,另一个线程在修改
b.在同一个线程内用同一个迭代器对象进行迭代、修改、迭代、修改. . .
共有有3种解决方案
1.用老的Vector/Hashtable类,上面2个问题都不用担心。
Vector/Hashtable所提供的所有方法都是 synchronized的。如果 迭代的过程中数据结构被修改了,迭代器可以反映最新的修改,也不会抛异常。但这种方法效率低下,不建议使用。
2.使用ArrayList/HashMap和同步包装器
可用 同步包装器使容器变成线程安全的
如果要迭代,需要这样
注意上面的代码每次进入同步块都生成了一个新的迭代器。如果你还用老的迭代器,2b的情况就可能发生,你会收到一个ConcurrentModificationException。
3.用java5.0新加入的ConcurrentLinkedQueue、ConcurrentHashMap、CopyOnWriteArrayList 和 CopyOnWriteArraySet
对这些集合进行并发修改是安全的。针对2b的问题,迭代器既不抛异常,也不会反映新的修改。就是说你迭代的是生成迭代器时的容器,不是最新的容器。
转载地址:/content/3295286.html
1.多线程并发修改一 个 集合 怎么办?
2.如果迭代的过程中 集合 被修改了怎么办?
a.一个线程在迭代,另一个线程在修改
b.在同一个线程内用同一个迭代器对象进行迭代、修改、迭代、修改. . .
共有有3种解决方案
1.用老的Vector/Hashtable类,上面2个问题都不用担心。
Vector/Hashtable所提供的所有方法都是 synchronized的。如果 迭代的过程中数据结构被修改了,迭代器可以反映最新的修改,也不会抛异常。但这种方法效率低下,不建议使用。
2.使用ArrayList/HashMap和同步包装器
可用 同步包装器使容器变成线程安全的
List synchArrayList = Collections.synchronizedList(new ArrayList()); Map synchHashMap = Collections.synchronizedMap(new HashMap());
如果要迭代,需要这样
synchronized (synchHashMap) { Iterator iter = synchHashMap.keySet().iterator(); while (iter.hasNext()) . . .; }
注意上面的代码每次进入同步块都生成了一个新的迭代器。如果你还用老的迭代器,2b的情况就可能发生,你会收到一个ConcurrentModificationException。
3.用java5.0新加入的ConcurrentLinkedQueue、ConcurrentHashMap、CopyOnWriteArrayList 和 CopyOnWriteArraySet
对这些集合进行并发修改是安全的。针对2b的问题,迭代器既不抛异常,也不会反映新的修改。就是说你迭代的是生成迭代器时的容器,不是最新的容器。
转载地址:/content/3295286.html
相关文章推荐
- Java常用集合元素使用小结
- Java集合工具Map、List、Set、Array使用小结
- Java基础之集合框架——使用堆栈Stack<>对象模拟发牌(TryDeal)
- JAVA学习第三十四课 (经常使用对象API)—List集合及其子类特点
- java 集合小结
- 使用Comparable和Comparator对Java集合对象进行排序
- FCK 异常小结(使用JAVA-core-2.5.jar)
- Java集合:Hashtable使用详解及源码分析
- java 实现链表向集合转化使用toArray()
- java基础加强--集合类的小结
- Java 集合系列17之 TreeSet详细介绍(源码解析)和使用示例
- Java 集合系列08之 List总结(LinkedList, ArrayList等使用场景和性能分析)
- java各种集合的线程安全
- JavaPoet的使用指南小结
- java关于使用Orika的mapperFactory进行对象拷贝以及集合拷贝
- java中使用for遍历集合是注意的空指针异常
- 使用JXPath访问java对象、集合和XML文件
- 如何使用Java中集合类的详细讲解
- JAVA基础--JAVA API集合框架(ArrayList、HashSet、HashMap使用)14
- Core Java笔记 9.集合(I) - 使用