知识卡片

并发容器选模型

普通读书笔记卡 · 1535

内容

选择并发容器要先看访问模型,而非看到”线程安全”就随便选:读多写少用 [[写时复制偏向读]];有序键值用 ConcurrentSkipListMap(跳表替代平衡树);高并发键值用 [[CHM分段到桶锁]];生产消费用 [[阻塞队列管背压]]。这些容器多基于 CAS+volatile 无锁实现,读写不互斥,是吞吐、内存和一致性的取舍。

参考来源

- 位置:《Java高并发核心编程.卷2,多线程、锁、JMM、JUC、高并发设计模式》第7章《JUC容器类》7.2节《JUC高并发容器》(源文件:_epub-src/OEBPS/Text/chapter231.xhtml) - 结论依据:原文列出List/Set/Map/Queue四类JUC高并发容器及各自对应场景,指出“无锁编程算法主要通过CAS(Compare And Swap)+Volatile组合实现”“读写不互斥:只有写操作需要使用基于CAS机制的乐观锁,读读操作之间可以不用互斥”,并说明“当读取和遍历操作远远大于列表的更新操作时,CopyOnWriteArrayList优于同步的ArrayList”,因此推出按访问模型选容器的结论。 - 原始内容:JUC高并发容器是基于非阻塞算法(或者无锁编程算法)实现的容器类……通过CAS保障操作的原子性,通过volatile保障变量内存的可见性……读写不互斥:只有写操作需要使用基于CAS机制的乐观锁,读读操作之间可以不用互斥……当读取和遍历操作远远大于列表的更新操作时,CopyOnWriteArrayList优于同步的ArrayList。