为什么java.util.concurrent 包里没有并发的ArrayList实现?
问: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。
转载自并发编程网 – ifeve.com本文链接地址: 为什么java.util.concurrent 包里没有并发的ArrayList实现?
相关推荐
在Java编程语言中,`java.util.Vector`是一个重要的集合类,它是`ArrayList`的早期版本,提供了线程安全的动态数组实现。这篇文章将对`Vector`类进行详细的总结,包括其特点、用法以及与`ArrayList`的区别。 1. **...
Java.util.concurrent包(虽然不是直接在Java.util下,但密切相关)包含了一系列线程安全的数据结构和并发工具,如Semaphore、ExecutorService、CountDownLatch等,极大地简化了多线程编程。 8. **枚举Set**: ...
24. **`java.util.ArrayList.ArrayListIterator`** 和 **`java.util.Iterator`**:迭代器接口,用于遍历集合。 25. **`java.util.stream.Stream`**:Java 8引入的流API,用于处理数据集合,支持函数式编程。 26. *...
`java.util.ConcurrentModificationException` 是一个在 Java 中常见的运行时异常,它通常发生在多线程环境中,当一个线程正在遍历一个集合(如 `ArrayList`, `HashMap` 等),而另一个线程同时尝试修改这个集合时。...
10. **`java.util.concurrent.*`**: 并发库,包括线程池、并发容器(如`ConcurrentHashMap`)、原子变量(如`AtomicInteger`)等。 11. **`java.io.File`**: 文件和目录操作,如创建、删除、读取文件信息。 12. **...
4. **`java.util.concurrent`包**:这个包包含了线程安全的数据结构(如ConcurrentHashMap)和并发工具类,如ExecutorService、Semaphore、CyclicBarrier等,用于高效地处理多线程场景。 5. **`java.util.logging....
6. `java.util.concurrent` 包: - 这个包包含了许多并发编程相关的工具类,如`ExecutorService`, `Semaphore`, `CountDownLatch`, `CyclicBarrier`等,以及线程池`ThreadPoolExecutor`。 7. `java.util.Random`:...
11. **队列和并发队列**:`java.util.Queue`接口及其实现如ArrayDeque、LinkedList(作为Queue的实现),以及`java.util.concurrent`包下的并发队列如LinkedBlockingQueue、ConcurrentLinkedQueue等,提供高效的数据...
11. **`java.util.concurrent`** 包:包含并发和多线程工具,如`ExecutorService`、`Future`和`Callable`。 12. **`java.util.logging.Logger`**:日志记录工具,用于输出程序运行时的信息。 13. **`java.lang....
`Thread`类允许创建和管理独立执行的线程,而`java.util.concurrent`包包含了许多高级并发工具,如线程池、未来结果(Future)和同步器(Semaphore)。 4. **网络编程**:`java.net`包提供了网络通信的接口和类,如...
8. **并发改进**:`java.util.concurrent` 包下,Java 8 对并发工具类进行了增强,例如 `ForkJoinPool` 和 `CompletableFuture`,提供了更高级的并发编程模型。 9. **反射与注解处理**:Sun 包源码中包含了 `sun....
- `java.util.concurrent` 包提供了丰富的并发工具,如`ExecutorService`、`Future`、`Semaphore`、`CountDownLatch`等,用于高效地管理线程和同步。 9. **其他工具类**: - `java.util.Random` 用于生成随机数。...
8. **`java.util.concurrent` 包**: 提供了线程安全的数据结构和并发工具,如`ExecutorService`、`Semaphore`、`CountDownLatch`等,帮助开发者处理多线程环境下的问题。 9. **`java.io` 包**: 包含了输入输出...
4. **多线程**:Java内置了对多线程的支持,`java.lang.Thread`类和`java.util.concurrent`包提供了线程创建、同步、并发工具类等功能,帮助开发者构建高效的多线程程序。 5. **I/O与NIO**:`java.io`和`java.nio`...
通过创建和管理Thread对象,可以实现并发执行任务,`java.util.concurrent`包则提供了高级并发工具,如ExecutorService、Semaphore、Future等。 5. **网络编程**:`java.net`包提供了Socket、ServerSocket等类,...
`java.util.concurrent`包还包含高级并发工具,如ExecutorService、Semaphore和CountDownLatch等。 5. **I/O和NIO**:Java 1.6的`java.io`包提供了传统阻塞I/O,而`java.nio`包则引入了非阻塞I/O,提供通道...
4. 集合框架:Java API的`java.util`和`java.util.concurrent`包中包含了丰富的集合类,如ArrayList、LinkedList、HashMap、HashSet等,它们提供了数据存储和操作的统一接口,使得数据处理更为便捷。 5. 网络编程:...
2. **集合框架**:在`java.util`包中,集合框架是Java 1.8的重要特性之一,包括List(如ArrayList、LinkedList)、Set(如HashSet、TreeSet)、Map(如HashMap、TreeMap)等接口和实现类。Java 8引入了新的集合接口...
`java.util.concurrent`包则提供了并发编程的支持,包括高级的线程池、同步容器等。`java.io.Util`虽然不如其他两个常见,但其中有一些辅助I/O操作的工具,如copy()方法用于文件复制。 在实际开发中,Swing、IO和...