Да, это потокобезопасно.
Синхронизированный блок предотвращает ненужный вызов нескольких потоков computeFieldValue()
. Поскольку field
является изменчивым, доступы в reset
и getField
все хорошо упорядочены.
Если первая проверка не равна нулю, getField
выполнена; result
возвращается.
В противном случае блокировка получается, за исключением любого другого потока, который может установить для поля значение, отличное от нуля, но позволяющего любому потоку установить field
в значение null. Если какой-либо поток устанавливает field
на ноль, ничего не должно было измениться; это условие, которое привело поток в синхронизированный блок. Если другой поток уже получил блокировку после проверки текущего потока и установил для поля ненулевое значение, вторая проверка обнаружит это.