【问题标题】:Is a modifying operation thread safe on a List if the underlying datastracture is CopyOnWriteArrayList?如果底层数据结构是 CopyOnWriteArrayList,则 List 上的修改操作线程是否安全?
【发布时间】:2019-12-26 15:50:03
【问题描述】:

我想让我的修改操作线程安全,同时还遵守有关应用程序设计的最佳实践。

假设我有一个 Zoo 类来管理其中的动物,比如向动物园添加一个新的 Animal,删除一个等等,我希望这些操作是线程安全的。为简单起见,我在动物园中有一个private List<Animal> animals 变量。我的第一个想法是在构造函数中将 animals 变量初始化为 CopyOnWriteArrayList 对象,每当创建新的 Zoo 对象时,如下所示:

private List<Animal> animals;

public Zoo() {
    this.animals = new CopyOnWriteArrayList<>();
}

public Zoo(List<Animal> animals) {
    this();
    addAnimals(animals);
}

public void addAnimals(Collection<Animal> animalsToAdd) {
    animals.addAll(animalsToAdd);
}

据我了解,CopyOnWriteArrayList 的方法是线程安全的,但我可以通过这种方式实现线程安全吗,即:通过让底层数据结构为CopyOnWriteArrayList,同时将引用变量保持为@ 987654329@?或者将List&lt;Animal&gt; animals 变量设为易失性和有问题的方法synchronized,会是更好的选择吗?

【问题讨论】:

    标签: java multithreading copyonwritearraylist


    【解决方案1】:

    它是线程安全的。如果您将this.animals 引用更改为this.animals = ...,您只需要考虑使animals 易失性和/或添加您自己的同步。如果你只是在构造函数中设置了一次并且不再更改它,那么你就可以开始了。

    【讨论】:

      猜你喜欢
      • 2013-06-10
      • 2011-02-26
      • 2010-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-27
      • 1970-01-01
      • 2013-07-30
      相关资源
      最近更新 更多