Die "Standard" Code of Copy on Write wie folgt aussieht:Verwendung von flüchtigem Feld in Copy-On-Write
...
private volatile SomeClass object;
private ReentrantLock lock = new ReentrantLock();
public change (...) {
lock.lock(); //set lock on write
try {
SomeClass newObject = new SomeClass();
//do something with new object
...
//set new object
object = newObject;
} finally {
lock.unlock(); //release lock
}
}
public Object getSomeField() {
SomeClass obj = object;
return obj.getSomeField();
}
die Frage: Warum das Feld, die Bezug auf "geschützt auf write" Objekt hält flüchtig? (Siehe z. B. Implementierung von CopyOnWriteArrayList). Soweit ich weiß, ist die Objektreferenzzuweisungsoperation atomar, , also sieht es so aus, als ob in volatilem Modifizierer keine Notwendigkeit besteht. Liege ich hier falsch?
Dies ist erforderlich, um andere Threads sichtbar zu machen. Ohne 'volatile' ist die Referenzzuweisung möglicherweise nur für den Thread sichtbar, der die Änderung vorgenommen hat. Sie würden es nicht benötigen, wenn die Methode unter der gleichen Sperre ausgeführt wird, mit der das Feld geändert wird. –
Danke! Dies ist der Aspekt, den ich nicht berücksichtigt habe –