"Стандартный" код копирования при записи выглядит так:
...
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();
}
Вопрос: почему поле, которое хранит ссылку на "защищенный от записи" объект, является изменчивым? (например, см. реализацию CopyOnWriteArrayList). Насколько я знаю, операция присвоения ссылки на объект является атомарной, поэтому похоже, что модификатор volatile не нужен. Я ошибаюсь здесь?
volatile
присвоение ссылки может быть видно только тому потоку, который внес изменение. Вам бы это не понадобилось, если бы метод get работал под той же блокировкой, которая используется для изменения поля. - person Andrew Logvinov   schedule 17.07.2016