`
abalone
  • 浏览: 130765 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

ConcurrentHashMap and CopyOnWriteArrayList

阅读更多
http://www-128.ibm.com/developerworks/cn/java/j-jtp07233/


ConcurrentModificationExceptions


上述改进使得 ConcurrentHashMap 能够提供比 Hashtable 高得多的可伸缩性,而且,对于很多类型的公用案例(比如共享的cache)来说,还不用损失其效率。

好了多少?

表 1对 Hashtable 和 ConcurrentHashMap 的可伸缩性进行了粗略的比较。在每次运行过程中, n 个线程并发地执行一个死循环,在这个死循环中这些线程从一个 Hashtable 或者 ConcurrentHashMap 中检索随机的key value,发现在执行 put() 操作时有80%的检索失败率,在执行操作时有1%的检索成功率。测试所在的平台是一个双处理器的Xeon系统,操作系统是Linux。数据显示了10,000,000次迭代以毫秒计的运行时间,这个数据是在将对 ConcurrentHashMap的 操作标准化为一个线程的情况下进行统计的。您可以看到,当线程增加到多个时, ConcurrentHashMap 的性能仍然保持上升趋势,而 Hashtable 的性能则随着争用锁的情况的出现而立即降了下来。

比起通常情况下的服务器应用,这次测试中线程的数量看上去有点少。然而,因为每个线程都在不停地对表进行操作,所以这与实际环境下使用这个表的更多数量的线程的争用情况基本等同。

表 1.Hashtable 与 ConcurrentHashMap在可伸缩性方面的比较

线程数  ConcurrentHashMap  Hashtable 
1 1.00 1.03
2 2.59 32.40
4 5.58 78.23
8 13.21 163.48
16 27.58 341.21
32 57.27 778.41

CopyOnWriteArrayList

在那些遍历操作大大地多于插入或移除操作的并发应用程序中,一般用 CopyOnWriteArrayList 类替代 ArrayList 。如果是用于存放一个侦听器(listener)列表,例如在AWT或Swing应用程序中,或者在常见的JavaBean中,那么这种情况很常见(相关的 CopyOnWriteArraySet 使用一个 CopyOnWriteArrayList 来实现 Set 接口)。

如果您正在使用一个普通的 ArrayList 来存放一个侦听器列表,那么只要该列表是可变的,而且可能要被多个线程访问,您就必须要么在对其进行迭代操作期间,要么在迭代前进行的克隆操作期间,锁定整个列表,这两种做法的开销都很大。当对列表执行会引起列表发生变化的操作时, CopyOnWriteArrayList 并不是为列表创建一个全新的副本,它的迭代器肯定能够返回在迭代器被创建时列表的状态,而不会抛出 ConcurrentModificationException 。在对列表进行迭代之前不必克隆列表或者在迭代期间锁定列表,因为迭代器所看到的列表的副本是不变的。换句话说, CopyOnWriteArrayList 含有对一个不可变数组的一个可变的引用,因此,只要保留好那个引用,您就可以获得不可变的线程安全性的好处,而且不用锁定列表。




分享到:
评论

相关推荐

    java并发编程艺术源码

    4. **并发容器**:包括ArrayList、LinkedList、Vector、Stack、ConcurrentHashMap、CopyOnWriteArrayList等,其中ConcurrentHashMap和CopyOnWriteArrayList等是线程安全的容器,适合在并发环境中使用。 5. **原子类...

    Java Generics and Collections (Java泛型与集合)

    6. **并发编程与集合**:如何在多线程环境中安全地使用集合,如ConcurrentHashMap和CopyOnWriteArrayList。 7. **集合性能优化**:选择合适的集合类型以提升性能,以及避免常见的性能陷阱。 8. **实用工具类**:如...

    Java多线程-知识点梳理和总结-超详细-面试知识点.docx

    逐步深入到Java多线程的高级话题,涵盖了Java多线程的所有方面,包括volatile关键字、Java内存模型、Happens-Before关系、synchronized关键字、ConcurrentHashMap、CopyOnWriteArrayList、Thread安全和CAS操作等。...

    Concurrent_and_Real-Time_Programming_in_Java.rar_java programmin

    Java提供了多种并发工具,如Thread类、Runnable接口、Executor框架和并发集合,如ConcurrentHashMap和CopyOnWriteArrayList,这些都是Java并发编程的基础。 Java的线程创建有两种方式:继承Thread类或实现Runnable...

    1999+-+Concurrent+Programming+in+Java[1].+Design+Principles+and+Pattern+2nd-ed+-+Doug+Lea.rar

    4. **并发工具类**:深入分析了Java并发API中的各种工具类,如ConcurrentHashMap、CopyOnWriteArrayList等,以及它们在并发场景下的高效实现。 5. **线程池**:讨论了线程池的设计与实现,包括ThreadPoolExecutor的...

    七周七并发高清版附送惊喜书籍

    3. **并发集合**:讲解ConcurrentHashMap、CopyOnWriteArrayList等并发安全集合的实现原理和使用场景。 4. **原子变量与CAS操作**:原子变量(AtomicInteger、AtomicReference等)和比较并交换(Compare-and-Swap,...

    并发编程实战

    此外,还会深入讨论并发集合,如ConcurrentHashMap、CopyOnWriteArrayList和ConcurrentLinkedQueue等。这些集合类在内部实现了线程安全,避免了锁的开销,提高了并发性能。例如,ConcurrentHashMap使用分段锁策略来...

    实战Java高并发程序设计模式视频

    4. **并发集合**:理解并使用并发安全的数据结构,如ConcurrentHashMap、CopyOnWriteArrayList和ConcurrentLinkedQueue,以及它们在并发环境下的性能表现。 5. **并发设计模式**:学习如何应用各种设计模式来解决...

    计算机后端-Java-Java高并发从入门到面试教程-课程总结.zip

    9. 并发容器:ArrayList、LinkedList、HashMap在并发环境下的问题及ConcurrentHashMap、CopyOnWriteArrayList等线程安全容器的使用。 10. BlockingQueue:了解阻塞队列的原理,使用它进行线程间通信。 四、原子类与...

    计算机后端-Java-Java高并发从入门到面试教程-可.zip

    Java提供了丰富的并发工具和API,如线程池(ExecutorService)、同步工具类(Semaphore、CyclicBarrier、CountDownLatch)以及并发集合(ConcurrentHashMap、CopyOnWriteArrayList等)。 **线程基础**:了解线程的...

    JUC并发编程与源码分析视频课.zip

    3. **并发容器**:如ArrayList、LinkedList、Vector等线程不安全的集合,以及它们的线程安全替代品如ConcurrentHashMap、CopyOnWriteArrayList等。分析这些容器在并发环境下的性能特点和适用场景。 4. **Executor...

    Java编程之高并发核心源码

    Java并发工具类库(java.util.concurrent)包含了许多高效并发数据结构,如ConcurrentHashMap、CopyOnWriteArrayList和ConcurrentLinkedQueue等。这些数据结构在多线程环境下表现优秀,通过内部的分段锁或者CAS...

    并发篇.pdf

    此外,Java并发包(java.util.concurrent)提供了一系列的并发容器,如ConcurrentHashMap和CopyOnWriteArrayList,它们在内部实现了线程安全的设计,提升了并发性能。 总之,理解和掌握并发编程是现代软件开发中的...

    JAVA并发编程实践中文版

    并发集合类如ConcurrentHashMap、CopyOnWriteArrayList和ConcurrentLinkedQueue,它们提供了线程安全的数据结构,能够在不使用显式同步的情况下实现高效并发操作。这些集合类的设计和实现策略,如分段锁和 CAS...

    谈一谈对JUC的理解Java系列2021.pdf

    JUC包包含了一系列的并发工具类,如线程池(ExecutorService)、并发集合(ConcurrentHashMap、CopyOnWriteArrayList等)、同步器(Semaphore、CountDownLatch、CyclicBarrier)以及原子类(AtomicInteger、...

    Java 并发编程实战 中英文+代码示例

    4. **并发集合**:Java并发包中的ConcurrentHashMap、CopyOnWriteArrayList和CopyOnWriteArraySet等集合,它们是线程安全的,适合多线程环境下使用,避免了传统的同步带来的性能开销。 5. **原子变量类**:...

    concurrent_programming_in_java_design_principles_a_Currency_desi

    3. **并发集合**:Java提供了如ConcurrentHashMap、CopyOnWriteArrayList等线程安全的集合类,它们在多线程环境中提供了高效且安全的数据访问。 4. **设计模式**:如生产者消费者模式(BlockingQueue)、读写锁模式...

    java 多线程同步

    高级实用工具类是`java.util.concurrent`的核心,包括线程安全集合(如ConcurrentHashMap、CopyOnWriteArrayList等)、线程池(ExecutorService、ThreadPoolExecutor、ScheduledThreadPoolExecutor等)、信号...

    Java高频核心面试总结完整版

    最后,Java并发框架如ConcurrentHashMap、CopyOnWriteArrayList等是并发编程中常用的数据结构。它们内部实现了高效的并发控制策略,使得在多线程环境下仍能保持高效性能。 总结来说,"Java高频核心面试总结完整版...

Global site tag (gtag.js) - Google Analytics