Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果基础DataStract是CopyOnWriteArrayList,则列表上的修改操作是否线程安全?_Java_Multithreading_Copyonwritearraylist - Fatal编程技术网

Java 如果基础DataStract是CopyOnWriteArrayList,则列表上的修改操作是否线程安全?

Java 如果基础DataStract是CopyOnWriteArrayList,则列表上的修改操作是否线程安全?,java,multithreading,copyonwritearraylist,Java,Multithreading,Copyonwritearraylist,我希望使我的修改操作线程安全,同时也坚持应用程序设计方面的最佳实践 比如说,我有一个动物园类来管理里面的动物,比如给动物园添加一个新动物,移除一个动物等等,我希望这些操作是线程安全的。为了简单起见,我在动物园里有一个私有的动物列表变量。我的第一个想法是,每当创建一个新的Zoo对象时,将animals变量初始化为构造函数中的CopyOnWriteArrayList对象,如下所示: private List<Animal> animals; public Zoo() { thi

我希望使我的修改操作线程安全,同时也坚持应用程序设计方面的最佳实践

比如说,我有一个动物园类来管理里面的动物,比如给动物园添加一个新动物,移除一个动物等等,我希望这些操作是线程安全的。为了简单起见,我在动物园里有一个私有的动物列表变量。我的第一个想法是,每当创建一个新的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,同时将引用变量保持为列表?或者让列表中的动物变为易变的并且有问题的方法是同步的,这将是一个更好的选择?

它是线程安全的。你只需要考虑让动物挥发和/或添加你自己的同步,如果你正在改变这一点。如果您只需在构造函数中设置一次,再也不更改它,那么您已经可以继续了。

它是线程安全的。你只需要考虑让动物挥发和/或添加你自己的同步,如果你正在改变这一点。如果您只需在构造函数中设置一次,再也不更改它,那么您已经可以继续了