I want to make my modifying operations thread safe, while also adhering to best practices regarding the design of the application.
I have let's say a Zoo class that manages the animals within it, like adding a new Animal to the zoo, removing one and so on, and I want these operations to be thread safe. For simplicity I have a private List<Animal> animals variable in the zoo. My first thought was to initialize the animals variable as a CopyOnWriteArrayList object within the constructor, whenever a new Zoo object is created, like so:
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);
}
As far as I have understood, the methods of CopyOnWriteArrayList are thread safe, but can I achieve thread safety this way, i.e: by having the underlying datastructure be a CopyOnWriteArrayList, while keeping the reference variable as a List? Or making the List<Animal> animals variable volatile and the methods in question synchronized, would be a better option?
It is threadsafe as is. You'd only need to consider making
animalsvolatile and/or adding your own synchronization if you were changing thethis.animalsreference withthis.animals = .... If you simply set it once in the constructor and never change it again then you're already good to go.