【发布时间】: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<Animal> animals 变量设为易失性和有问题的方法synchronized,会是更好的选择吗?
【问题讨论】:
标签: java multithreading copyonwritearraylist