我想让我的修改操作线程安全,同时也遵守有关应用程序设计的最佳实践。
我假设有一个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 和有问题的方法synchronize
d 会是更好的选择吗?