如果基础数据是 CopyOnWriteArrayList,则修改操作线程在 List 上是否安全?



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

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

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,同时将引用变量保留为List?或者使List<Animal> animals变量易变并且有问题的方法synchronized,会是更好的选择吗?

它是线程安全的。如果您使用this.animals = ...更改this.animals引用,则只需考虑使animals易失性和/或添加自己的同步。如果您只是在构造函数中设置它一次并且不再更改它,那么您已经很好了。

最新更新