为什么java.util.concurrent 包里没有并发的ArrayList实现?
2023-09-14 08:56:51 时间
原文链接 作者:Stephen C 译者:郑旭东 校对:方腾飞
问:JDK 5在java.util.concurrent里引入了ConcurrentHashMap,在需要支持高并发的场景,我们可以使用它代替HashMap。但是为什么没有ArrayList的并发实现呢?难道在多线程场景下我们只有Vector这一种线程安全的数组实现可以选择么?为什么在java.util.concurrent 没有一个类可以代替Vector呢?
答:我认为在java.util.concurrent包中没有加入并发的ArrayList实现的主要原因是:很难去开发一个通用并且没有并发瓶颈的线程安全的List。
像ConcurrentHashMap这样的类的真正价值(The real point / value of classes)并不是它们保证了线程安全。而在于它们在保证线程安全的同时不存在并发瓶颈。举个例子,ConcurrentHashMap采用了锁分段技术和弱一致性的Map迭代器去规避并发瓶颈。
所以问题在于,像“Array List”这样的数据结构,你不知道如何去规避并发的瓶颈。拿contains() 这样一个操作来说,当你进行搜索的时候如何避免锁住整个list?
另一方面,Queue 和Deque (基于Linked List)有并发的实现是因为他们的接口相比List的接口有更多的限制,这些限制使得实现并发成为可能。
CopyOnWriteArrayList是一个有趣的例子,它规避了只读操作(如get/contains)并发的瓶颈,但是它为了做到这点,在修改操作中做了很多工作和修改可见性规则。 此外,修改操作还会锁住整个List,因此这也是一个并发瓶颈。所以从理论上来说,CopyOnWriteArrayList并不算是一个通用的并发List。JUC:java.util.concurrent理解与使用示例 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。
java.util.concurrent解析——ThreadPoolExecutor源码解析 任何一种语言、框架,线程都是非常重要的一部分。要想实现异步就需要通过异步线程,但是频繁地创建销毁线程会带来较大的性能开销,而线程池就是为解决这一问题而出现的
ali清英 方腾飞,花名清英,英文名kiral,并发编程网创始人,支付宝技术专家,《Java并发编程的艺术》作者。
相关文章
- JAVA-JSP内置对象之request获得参数的所有参数值(多个值)
- JAVA 注解教程(四)Java 预置的注解
- [高并发]Java高并发编程系列开山篇--线程实现
- Servlet使用适配器模式进行增删改查案例(IDeptDao.java和IEmpDao.java)
- Java实现蓝桥杯正则切分
- Java实现基础练习十进制转十六进制
- Java 蓝桥杯 算法训练 字符串的展开 (JAVA语言实现)
- Java 蓝桥杯 算法训练 字符串的展开 (JAVA语言实现)
- Java 蓝桥杯 算法训练 字符串的展开 (JAVA语言实现)
- 构建高性能服务(二)java高并发锁的3种实现
- (转载)java多态(2)-------Java转型(向上或向下转型)
- 彻底搞清楚Java并发 (一) 基础
- 【JAVA】 01-Java基础知识
- 深入理解JAVA虚拟机--Idea远程执行本地Java代码
- Java多线程和并发基础面试问答
- 使用Java标准的java.util.EventListener实现观察者-发布者设计模式
- Atitit web httphandler的实现 java python node.js c# net php 目录 1.1. Java 过滤器 servelet1 1.2. Python的
- Atitit java播放器调音速率快慢的实现 目录 1.1. 原理 本质上是改变采样率即可1 2. 使用Java增加/降低AudioInputStream的音频播放速度(Increase/dec
- java并发编程-线程安全1:servlet访问统计
- 【Java实战】工作中并发处理规范
- 【项目实战】并发编程之Java集合框架中的一个线程安全的队列实现 ——BlockingQueue入门介绍
- 【Java】java中javaSE与javaEE的区别
- 【Java 并发编程实战】使用 AQS 实现一个简单的互斥锁
- 阿里巴巴2020届秋招最后一班车 企业智能事业部 企业大脑技术部 2020届秋招 Java 开发工程师
- 【Java 并发编程】轻量级锁和偏向锁详解
- JAVA语言之Java 中不同的并行实现的性能比较
- Java软件开发 | 高并发编程篇之——安全访问的集合(2)
- java反射
- 【java】Java 中泛型的实现原理
- 【Java 8 新特性】Java Comparator.reverseOrder | 倒序排序-静态方法