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
将“调整大小的数组”集合实现与“同步每个操作”结合在一起bit 是另一个糟糕设计的例子;装饰方法可以更清晰地分离关注点。
【讨论】:
值得一提(关于性能参数)如果JVM(对于Java 6+)可以通过转义分析确定同步是不必要的,则不使用它。但很明显,这只适用于可以确定的情况。以上是关于ArrayList 中的线程安全的主要内容,如果未能解决你的问题,请参考以下文章