Всегда ли объект видит свое последнее внутреннее состояние независимо от потока?
Просто чтобы прояснить для целей этого вопроса и его ответов, объект не делает ничего; это просто память. Потоки являются исполняющей сущностью. Неверно говорить, видит ли объект все, что угодно . Это поток, который видит / читает состояния объекта.
Это не указано в javadoc, но
Executors.newScheduledThreadPool(5);
возвращает ScheduledThreadPoolExecutor
.
Ваш код использует
executorService.scheduleWithFixedDelay(counter, 1, 1, TimeUnit.SECONDS);
Javadoc для ScheduledThreadPoolExecutor#scheduledWithFixedDelay
состояний
Отправляет периодическое действие, которое становится активным первым после заданного
первоначальная задержка, а затем с заданной задержкой между
прекращение одного исполнения и начало следующего.
Класс Javadoc дальнейшие уточнения
Последовательное выполнение периодического задания, запланированного через
scheduleAtFixedRate
или scheduleWithFixedDelay
не перекрываются.
Хотя разные потоки могут выполнять разные исполнения,
последствия предыдущих казней происходят раньше, чем последующие .
Таким образом, каждое выполнение Counter#run
гарантированно будет видеть значение count
после того, как оно было увеличено предыдущим выполнением. Например, третье выполнение будет считывать значение count
, равное 2
, прежде чем оно выполнит свое увеличение.
Вам не нужен volatile
или какой-либо другой дополнительный механизм синхронизации для этого конкретного варианта использования .