Рассмотрим фрагмент из Java Параллелизм на практике -Что произойдет, если переменная volatile будет записана из 2 потоков?
@ThreadSafe
public class SynchronizedInteger{
@GuardedBy("this") private int value;
public synchronized int getValue() {
return value;
}
public synchronized void setValue(int value) {
this.value = value;
}
}
Выписка из того же book-
Хороший способ думать о летучих переменных, чтобы представить себе, что они ведут себя примерно так класс SynchronizedInteger в листинге выше, , заменив чтение и запись изменчивой переменной на вызовы, чтобы получить и установить. Тем не менее доступ к изменчивой переменной не выполняет блокировки, поэтому не может вызвать блокировку исполняемого потока, что делает изменчивые переменные более сильным синхронизационным механизмом, чем синхронизированным.
Особый случай удержания резьбы применяется к переменным летучим. Безопасно выполнять операции чтения-изменения-записи по общим переменным волатильности, если вы гарантируете, что изменчивая переменная записывается только из одного потока.
Так что, если вы сделаете переменная экземпляра указанного класса летучим, а затем удалить синхронизированные ключевое слово, после этого предположим, что есть 3 темы
нитяным & Thread B Обращаемся к одной и той же изменчивой переменной ,
Резьба C считывает изменчивую переменную.
Поскольку переменная volatile теперь написана из 2 потоков, почему небезопасно выполнять операции чтения-изменения-записи этой общей изменчивой переменной?