ArrayList 中的线程安全

Posted

技术标签:

【中文标题】ArrayList 中的线程安全【英文标题】:Thread Safety in ArrayList [duplicate] 【发布时间】:2019-12-01 05:07:18 【问题描述】:

为什么 Java 中的 ArrayList 类没有实现线程安全。但是之前的类 Vector 是用线程安全实现的?不使用线程安全实现有什么特别的原因吗?

【问题讨论】:

Java 开发人员认为将线程安全强制纳入标准容器类型并不是一个好主意。 线程安全存在(性能)成本,您不想强加给不需要它的每个人。此外,如果您确实需要它,一个简单的解决方案(如同步所有方法(如 Vector))可能对您来说仍然不够。 我的问题不是如何使线程安全。我的问题很明显是为什么它没有以这种方式实现,因为它的先前类是使用它实现的 【参考方案1】:

取自Why is Java Vector (and Stack) class considered obsolete or deprecated?


Vector 同步每个单独的操作。这几乎不是你想做的。

通常您希望同步整个操作序列。同步单个操作都不太安全(例如,如果您迭代 Vector,您仍然需要锁定以避免其他任何人同时更改集合,这将导致 ConcurrentModificationException 在迭代中线程)但也更慢(为什么一次就足够了,为什么要反复取出锁)?

当然,它也有锁定的开销,即使你不需要。

基本上,在大多数情况下,这是一种非常有缺陷的同步方法。正如Brian Henk 先生 指出的那样,您可以使用诸如Collections.synchronizedList 之类的调用来装饰集合 - 事实上Vector 将“调整大小的数组”集合实现与“同步每个操作”结合在一起位是糟糕设计的另一个例子;装饰方法可以更清晰地分离关注点。

【讨论】:

值得一提(关于性能参数)如果JVM(对于Java 6+)可以通过转义分析确定同步是不必要的,则不使用它。但很明显,这只适用于可以确定的情况。

以上是关于ArrayList 中的线程安全的主要内容,如果未能解决你的问题,请参考以下文章

JAVA中的线程安全与非线程安全

ARRAYLIST如何保证线程安全

ArrayList如何保证线程安全

Java ArrayList / String / atomic 变量读取线程安全吗?

ArrayList的实现原理以及实现线程安全

ArrayList源码和多线程安全问题分析