Установка логического значения является атомарной, и в этом примере нет логики «читать, затем изменить», поэтому доступ к переменной не нужно синхронизировать в этом конкретном случае.
Однако переменная должна быть по крайней мере помечена как volatile.
Пометка переменной volatile не синхронизирует доступ потоков к ней; он гарантирует, что поток не пропустит обновление другого потока переменной из-за оптимизации кода или кэширования значений. Например, без volatile
код внутри run()
может прочитать значение threadsRunning
только один раз в начале, кэшировать значение и затем использовать это кэшированное значение в операторе if
каждый раз вместо чтения переменная снова из основной памяти. Если значение threadsRunning
изменяется другим потоком, оно может не быть получено.
Как правило, если вы используете переменную из нескольких потоков и ее доступ не синхронизирован, вы должны пометить ее как энергозависимую.