我想使我的修改操作线程安全,同时遵守有关应用程序设计的最佳实践。
我有一个管理其中动物的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
变量易变并且有问题的方法synchronize
d,会是更好的选择吗?
它是线程安全的。如果您使用this.animals = ...
更改this.animals
引用,则只需考虑使animals
易失性和/或添加自己的同步。如果您只是在构造函数中设置它一次并且不再更改它,那么您已经很好了。