Нет, это может быть выполнено несколько раз.Синхронизация «сбрасывает» изменения в другие потоки, и без этого теоретически никогда нельзя передать изменения, сделанные в одном потоке, за пределы этого потока.
Но в статье не говорится, что computeHashCode
будет называться точнооднажды, просто состояние гонки не вызывает никаких проблем.Запись int
гарантированно является атомарной, и если computeHashCode
идемпотентен (что требует, чтобы класс и его поля были эффективно финальными), вы просто перезапишите предыдущие значения тем же значением, так что ничего плохого не произойдет.