Java 集合框架 : Some thread safe and some not?

标签 java collections concurrenthashmap

我正在学习 Java 集合框架(不是并发集合框架),我开始知道有些集合实现是线程安全的,有些则不是。

在我阅读的大部分资料中,所有提到的xyz 是线程安全的而abc 不是线程安全的。

但是,是否保持给定集合类型(例如,List、Set、Queue,甚至在 Map.. 中)线程安全的决定基于什么逻辑?

我的问题是关于“传统”集合框架而不是并发集合框架。

理解这一点的任何输入都会有很大帮助。

最佳答案

线程安全会带来开销(尽管在现代 VM 中,开销比设计收集框架时要低得多)。因此,除非特别需要,否则集合不是线程安全的,JDK1.1 集合除外——在设计它们时,其理念更像是“让我们以牺牲一些性能为代价,尽可能少地留出错误空间”。

我们在 Java API 的发展中有几个阶段。

JDK1.1

在 Java 1.1 版本中,我们有数据结构 VectorHashtable。它们完全同步,提供一定程度的线程安全。

JDK1.2

在 Java 1.2 版本中,引入了集合框架。没有一个基本集合是线程安全的(它们不同步任何操作):ArrayListLinkedListHashMapTreeMap Set 实现。

但是您可以通过调用Collections.synchronizedMapCollections.synchronizedList等获得同步版本

JDK1.5

在 Java 1.5 版本中,引入了 java.util.concurrent 框架。它们包含专门为多线程使用而构建的数据。这些提供了一定程度的线程安全。


请注意,即使使用同步集合,也可能引入数据竞争;这仅意味着您不能破坏集合的内部结构(将保留集合的所有不变量)

例如,如果您有一个分两步的过程,您首先检查集合是否不包含某个元素,然后在第二步中插入该元素。如果您不为这两个步骤提供自己的同步,则如果两个线程同时执行此操作,则可以将元素添加两次。

关于Java 集合框架 : Some thread safe and some not?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47855270/

相关文章:

java - Ant 更好的方法 <sleep> 而不是跳过它

java - 在JFrame中添加图像: Java

java - 每个声明之间有什么区别,对每个声明有什么影响?

singleton - EJB3 单例 session Bean 和 ConcurrentHashMap

java - 如何在java/scala中锁定免费使用两个ConcurrentHashMap?

javascript - Spring WebFlux 和 WebSocket

java - 如何将两个注释简化为一个

scala - 使用泛型类型生成泛型集合

javascript - Symfony 2 中的 ArrayCollection(表单集合)索引冲突

java - ConcurrentHashMap检索操作不带锁?