我正在学习 Java 集合框架(不是并发集合框架),我开始知道有些集合实现是线程安全的,有些则不是。
在我阅读的大部分资料中,所有提到的xyz
是线程安全的而abc
不是线程安全的。
但是,是否保持给定集合类型(例如,List、Set、Queue,甚至在 Map.. 中)线程安全的决定基于什么逻辑?
我的问题是关于“传统”集合框架而不是并发集合框架。
理解这一点的任何输入都会有很大帮助。
最佳答案
线程安全会带来开销(尽管在现代 VM 中,开销比设计收集框架时要低得多)。因此,除非特别需要,否则集合不是线程安全的,JDK1.1 集合除外——在设计它们时,其理念更像是“让我们以牺牲一些性能为代价,尽可能少地留出错误空间”。
我们在 Java API 的发展中有几个阶段。
JDK1.1
在 Java 1.1 版本中,我们有数据结构 Vector
和 Hashtable
。它们完全同步,提供一定程度的线程安全。
JDK1.2
在 Java 1.2 版本中,引入了集合框架。没有一个基本集合是线程安全的(它们不同步任何操作):ArrayList
、LinkedList
、HashMap
、TreeMap
和 Set
实现。
但是您可以通过调用Collections.synchronizedMap
、Collections.synchronizedList
等获得同步版本
JDK1.5
在 Java 1.5 版本中,引入了 java.util.concurrent
框架。它们包含专门为多线程使用而构建的数据。这些提供了一定程度的线程安全。
请注意,即使使用同步集合,也可能引入数据竞争;这仅意味着您不能破坏集合的内部结构(将保留集合的所有不变量)
例如,如果您有一个分两步的过程,您首先检查集合是否不包含某个元素,然后在第二步中插入该元素。如果您不为这两个步骤提供自己的同步,则如果两个线程同时执行此操作,则可以将元素添加两次。
关于Java 集合框架 : Some thread safe and some not?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47855270/