`
世说新语
  • 浏览: 23381 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Java中线程安全集合的使用小结

阅读更多

线程安全的集合包含2个问题
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的问题,迭代器既不抛异常,也不会反映新的修改。就是说你迭代的是生成迭代器时的容器,不是最新的容器。

分享到:
评论

相关推荐

    java线程安全总结.doc

    以下是对Java线程安全的深入总结: ### 一、线程安全的定义 线程安全是指当多个线程访问同一块代码时,如果每个线程都能得到预期的结果,且不产生数据不一致或同步问题,那么这块代码就被称为线程安全的。Java中的...

    Java多线程知识点总结

    Java多线程是Java编程语言中一个非常重要的概念,它允许开发者在一个程序中创建多个执行线程并行运行,以提高程序的执行效率和响应速度。在Java中,线程的生命周期包含五个基本状态,分别是新建状态(New)、就绪...

    Java多线程运算集合

    - 这些方法用于实现线程间的等待-通知机制,通常在同步上下文中使用。 #### 七、Java线程的调度 - **线程调度策略**: - Java线程调度主要依赖于操作系统的调度机制。 - 线程的优先级、让步(`yield`)、休眠(`...

    Java的线程安全与不安全集合.docx

    总结来说,理解Java中的线程安全与不安全集合是非常重要的,这有助于在设计并发程序时选择合适的数据结构和操作方式,以确保程序的正确性和性能。在面对线程安全问题时,我们可以借助如`synchronized`关键字、`...

    Java多线程的总结

    Java提供了多种线程间通信的方法,如wait()、notify()和notifyAll(),它们必须在同步块或同步方法中使用,用于控制线程的执行顺序。此外,还可以使用BlockingQueue阻塞队列实现生产者消费者模式,实现线程间的协作。...

    Java多线程小结

    ### Java多线程小结 #### 一、多线程的概念与意义 多线程是Java编程中的一个重要概念,指的是程序在运行时可以同时执行多个线程的能力。它能够提高程序的性能,尤其是在多核处理器的环境下。多线程使得程序能够更...

    JAVA多线程编程技术PDF

    总结起来,“JAVA多线程编程技术PDF”涵盖了多线程的基本概念、同步机制、线程通信、死锁避免、线程池以及线程安全的集合类等内容。通过深入学习这份资料,开发者可以全面掌握Java多线程编程技术,提升程序的并发...

    详解java各种集合的线程安全

    Java 集合的线程安全是指在多线程环境中,集合操作的安全性。 Java 中有多种集合类,如 Vector、ArrayList、LinkedList、HashTable、HashMap、HashSet 等,这些集合类在多线程环境中的安全性各不相同。 Vector 和 ...

    java多线程设计

    4. 使用并发集合:Java并发包(java.util.concurrent)提供了线程安全的集合,如ConcurrentHashMap、CopyOnWriteArrayList等,它们内部实现了线程同步,无需额外的同步控制。 5. 原子操作(Atomic):AtomicInteger...

    java线程安全总结.pdf

    标题“java线程安全总结.pdf”指向了文档的主要内容:这是关于Java编程语言中的线程安全问题的总结性资料。线程安全是并发编程中的一个核心概念,它与Java多线程技术紧密相关。文档的描述信息非常简洁,只是重复了...

    关于如何解决HashMap线程安全问题的介绍

    4. 避免在多线程环境中直接使用HashMap:如果你确定不需要在多线程环境下共享HashMap,那么可以考虑局部变量的方式,只在单个线程中使用HashMap,这样就无需担心线程安全问题。 总结起来,理解HashMap的线程不安全...

    java多线程中的原子操作

    总结来说,Java多线程中的原子操作是保证并发安全的重要手段,通过使用`java.util.concurrent.atomic`包中的原子类,开发者可以编写出高效且线程安全的代码。同时,自定义的数据结构和工具类如CircularSet和...

    Java集合框架使用总结

    - **线程安全类**:在Java集合框架中,有一部分类是线程安全的,这意味着它们可以在多线程环境中安全使用,无需外部同步。这些类包括: - **`Vector`**:线程安全的动态数组,相较于`ArrayList`增加了同步机制。 -...

    Java 多线程学习总结归纳(附代码)

    Java线程有10个优先级,从MIN_PRIORITY(1)到MAX_PRIORITY(10),默认优先级是NORM_PRIORITY(5)。线程优先级并不保证执行顺序,但高优先级的线程更有可能获得CPU资源。 4. **线程的休眠与唤醒**: - `Thread....

    Java中的集合学习总结

    ### Java中的集合学习总结 #### 集合框架概述 在Java编程语言中,集合框架是一种存储和操作数据的重要机制。它提供了灵活多样的数据结构,以满足不同场景下的需求。集合框架主要由三大核心部分组成:集(Set)、列表...

Global site tag (gtag.js) - Google Analytics