Нет, если у вас нет какой-либо другой доступ, что вы не показано, registered
прекрасно без volatile
.
Удаление volatile
ускорит код, когда-либо так слегка, я думаю. Но я думаю, что основное преимущество удаления volatile
- это очистка кода для сопровождающего.
В этом случае нет никакой разницы между volatile
и синхронизированными методами, которые я могу видеть, поэтому используйте тот или иной. (За исключением, что синхронизированные методы делают объект, который вы используете, чтобы охранять registered
поле общественного, который может быть хорошим и плохим. Частный volatile
поддерживает синхронизацию блокировки частных.)
Чтобы попытаться выяснить, что Последнее утверждение, если у вас есть класс, как это:
public class Reg {
private boolean registered;
synchronized boolean registered() {
return registered;
}
void setRegistered(boolean registered) {
synchronized (this) {
this.registered = registered;
}
}
}
Что вы затем создать новый экземпляр:
public class Test {
public static Reg reg;
public void static main(String... args) {
reg = new Reg();
synchronized(reg) {
// do stuff
}
}
}
Любой, кто пытается получить доступ к reg.registered()
, пока этот замок в Test
удерживается, блокируется до тех пор, пока не будет освобождена блокировка. Блокировка является общедоступной для всех, кто может видеть объект. Это может быть хорошо и плохо. Это позволяет другим классам контролировать доступ к вашим методам, что может быть полезно для атомарности, но оно также может испечь управление потоками в исходной базе, где оно распространяется повсюду, а не просто инкапсулируется одним классом. Хорошо и плохо. Вероятно, есть и другие примеры того, почему это может быть хорошо и плохо, это всего лишь один.
Не стоит упоминать, что операторы 'synchronized' *, вероятно, не нужны * (если вы не хотите, чтобы эти методы не вызывались в других синхронизированных блоках в другом месте, мы не видим). В этом случае использование 'synchronized' для инкапсуляции переменной' volatile 'нарушает цель 'volatile'. –