1

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

我假设有一个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是线程安全的,但是我可以通过这种方式实现线程安全,即:通过让底层数据结构为 a CopyOnWriteArrayList,同时将参考变量保持为 aList吗?或者使List<Animal> animals变量 volatile 和有问题的方法synchronized 会是更好的选择吗?

4

1 回答 1

3

它是线程安全的。animals如果您this.animals使用this.animals = .... 如果您只是在构造函数中设置一次并且不再更改它,那么您已经可以开始了。

于 2019-12-26T15:56:31.733 回答