Java 如果基础DataStract是CopyOnWriteArrayList,则列表上的修改操作是否线程安全?
我希望使我的修改操作线程安全,同时也坚持应用程序设计方面的最佳实践 比如说,我有一个动物园类来管理里面的动物,比如给动物园添加一个新动物,移除一个动物等等,我希望这些操作是线程安全的。为了简单起见,我在动物园里有一个私有的动物列表变量。我的第一个想法是,每当创建一个新的Zoo对象时,将animals变量初始化为构造函数中的CopyOnWriteArrayList对象,如下所示:Java 如果基础DataStract是CopyOnWriteArrayList,则列表上的修改操作是否线程安全?,java,multithreading,copyonwritearraylist,Java,Multithreading,Copyonwritearraylist,我希望使我的修改操作线程安全,同时也坚持应用程序设计方面的最佳实践 比如说,我有一个动物园类来管理里面的动物,比如给动物园添加一个新动物,移除一个动物等等,我希望这些操作是线程安全的。为了简单起见,我在动物园里有一个私有的动物列表变量。我的第一个想法是,每当创建一个新的Zoo对象时,将animals变量初始化为构造函数中的CopyOnWriteArrayList对象,如下所示: private List<Animal> animals; public Zoo() { thi
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,同时将引用变量保持为列表?或者让列表中的动物变为易变的并且有问题的方法是同步的,这将是一个更好的选择?它是线程安全的。你只需要考虑让动物挥发和/或添加你自己的同步,如果你正在改变这一点。如果您只需在构造函数中设置一次,再也不更改它,那么您已经可以继续了。它是线程安全的。你只需要考虑让动物挥发和/或添加你自己的同步,如果你正在改变这一点。如果您只需在构造函数中设置一次,再也不更改它,那么您已经可以继续了