Предположим, что у меня есть следующий код
private volatile Service service;
public void setService(Service service) {
this.service = service;
}
public void doWork() {
service.doWork();
}
Измененное поле, помеченное как изменчивое, и его значение не зависит от предыдущего состояния. Итак, это правильный многопоточный код (не беспокойтесь о реализациях Service
в течение минуты).
Насколько я знаю, чтение изменчивой переменной похоже на ввод блокировки, с точки зрения видимости памяти. Это потому, что чтение нормальных переменных не может быть переупорядочено с чтением изменчивых переменных.
Означает ли это, что правильный код правильный?
private volatile boolean serviceReady = false;
private Service service;
public void setService(Service service) {
this.service = service;
this.serviceReady = true;
}
public void doWork() {
if ( serviceReady ) {
service.doWork();
}
}