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

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

【问题讨论】:

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

标签: java collections


【解决方案1】:

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


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

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

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

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

【讨论】:

  • 值得一提(关于性能参数)如果JVM(对于Java 6+)可以通过转义分析确定同步是不必要的,则不使用它。但很明显,这只适用于可以确定的情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-10
  • 1970-01-01
  • 2017-07-03
  • 2021-01-24
相关资源
最近更新 更多