1. 线程安全的集合包含2个问题
  2. 1.多线程并发修改一 个 集合 怎么办?
  3. 2.如果迭代的过程中 集合 被修改了怎么办?
  4. a.一个线程在迭代,另一个线程在修改
  5. b.在同一个线程内用同一个迭代器对象进行迭代、修改、迭代、修改. . .
  6. 共有有3种解决方案
  7. 1.用老的Vector/Hashtable类,上面2个问题都不用担心。
  8. Vector/Hashtable所提供的所有方法都是 synchronized的。如果 迭代的过程中数据结构被修改了,迭代器可以反映最新的修改,也不会抛异常。但这种方法效率低下,不建议使用。
  9. 2.使用ArrayList/HashMap和同步包装器
  10. 可用 同步包装器使容器变成线程安全的
  11. Java代码
  12. 1. List synchArrayList = Collections.synchronizedList(new ArrayList());<br>
  13. 2. Map synchHashMap = Collections.synchronizedMap(new HashMap())<br>
  14. List synchArrayList = Collections.synchronizedList(new ArrayList());
  15. Map synchHashMap = Collections.synchronizedMap(new HashMap())
  16. 如果要迭代,需要这样
  17. Java代码
  18. 1. synchronized (synchHashMap)<br>
  19. 2. {<br>
  20. 3.    Iterator iter = synchHashMap.keySet().iterator();<br>
  21. 4.    while (iter.hasNext()) . . .;<br>
  22. 5. }<br>
  23. synchronized (synchHashMap)
  24. {
  25. Iterator iter = synchHashMap.keySet().iterator();
  26. while (iter.hasNext()) . . .;
  27. }
  28. 注意上面的代码每次进入同步块都生成了一个新的迭代器。如果你还用老的迭代器,2b的情况就可能发生,你会收到一个ConcurrentModificationException。
  29. 3.用java5.0新加入的ConcurrentLinkedQueue、ConcurrentHashMap、CopyOnWriteArrayList 和 CopyOnWriteArraySet
  30. 对这些集合进行并发修改是安全的。
  31. 针对2b的问题,迭代器既不抛异常,也不会反映新的修改。就是说你迭代的是生成迭代器时的容器,不是最新的容器。

Java集合的线程安全用法的更多相关文章

  1. Java常用四大线程池用法以及ThreadPoolExecutor详解

    为什么用线程池? 1.创建/销毁线程伴随着系统开销,过于频繁的创建/销毁线程,会很大程度上影响处-理效率 2.线程并发数量过多,抢占系统资源从而导致阻塞 3.对线程进行一些简单的管理 在Java中,线 ...

  2. Java 集合框架之set用法

    Java 集合框架之set 一个简单的例子 创建一个Customer类,类中的属性有姓名(name).年龄(age).性别(gender),每个属性分别有get/set 方法.然后创建两个Custom ...

  3. 08 Java 集合的线程安全问题

    1 Java中的集合 Java中的集合分为同步的集合(线程安全)和线程不安全的集合 例如 : ArrayList和Vector的区别: 一.同步性:Vector是线程安全的,也就是说是同步的,而Arr ...

  4. java 集合及其线程安全 及其 set linkedList map table 区别

    早在jdk的1.1版本中,所有的集合都是线程安全的.但是在1.2以及之后的版本中就出现了一些线程不安全的集合,为什么版本升级会出现一些线程不安全的集合呢?因为线程不安全的集合普遍比线程安全的集合效率高 ...

  5. Java集合中List的用法

    List接口是Collection接口的子接口,List有一个重要的实现类--ArrayList类,List中的元素是有序排列的而且可重复,所以被称为是序列. List可以精确的控制每个元素的插入位置 ...

  6. Java集合框架(一)—— Collection、Iterator和Foreach的用法

    1.Java集合概述 在编程中,常常需要集中存放多个数据.当然我们可以使用数组来保存多个对象.但数组长度不可变化,一旦在初始化时指定了数组长度,则这个数组长度是不可变的,如果需要保存个数变化的数据,数 ...

  7. Java集合中Set的常见问题及用法

    在这里演示的案例是衔接Java集合中的List(点击查看)那篇博文的,本节我们学习的Set的用法. Set是Collection的一个重要的子接口,Set中的元素是无序排列的,并且元素不可以重复,被称 ...

  8. 四种Java线程池用法解析

    本文为大家分析四种Java线程池用法,供大家参考,具体内容如下 http://www.jb51.net/article/81843.htm 1.new Thread的弊端 执行一个异步任务你还只是如下 ...

  9. Java集合中迭代器的常用用法

    该例子展示了一个Java集合中迭代器的常用用法public class LinkedListTest { public static void main(String[] args) { List&l ...

随机推荐

  1. CPU tick counter

    #define rdtscll(val) \ __asm__ __volatile__ ("rdtsc" : "=A" (val)) example #incl ...

  2. Flatten Binary Tree to Linked List

    Flatten a binary tree to a fake "linked list" in pre-order traversal. Here we use the righ ...

  3. Xenomai 安装准备工作

    一些安装xenomai的参考资料: http://my.oschina.net/hevakelcj/blog/124290 http://blog.sina.com.cn/s/blog_60b9ee1 ...

  4. div隐藏

    <div style="display:none">                 <textarea id="BodyBox2" runa ...

  5. 【leetcode】Implement strStr()

    Implement strStr() Implement strStr(). Returns the index of the first occurrence of needle in haysta ...

  6. 42.旋转数组的最小元素[Get min value of rotated array]

    [题目] 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个排好序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5 ...

  7. (转)SQL Server 中WITH (NOLOCK)浅析

    概念介绍 开发人员喜欢在SQL脚本中使用WITH(NOLOCK), WITH(NOLOCK)其实是表提示(table_hint)中的一种.它等同于 READUNCOMMITTED . 具体的功能作用如 ...

  8. Linux下挂载NTFS格式的U盘或硬盘

    我们知道在Linux下挂载fat32的U盘非常容易,使用mount /dev/drive_name /mnt/指定目录这样就可以挂载了,但是如果U盘或者硬盘的格式是NTFS的话,那么Linux是不能识 ...

  9. Java for LeetCode 203 Remove Linked List Elements

    Remove all elements from a linked list of integers that have value val. Example Given: 1 --> 2 -- ...

  10. 【JAVA、C++】LeetCode 007 Reverse Integer

    Reverse digits of an integer. Example1: x = 123, return 321 Example2: x = -123, return -321 解题思路:将数字 ...