Выбор ответа Junior Потоки и Java Memory Model спрашивают часто обновлено

volatile и count++

Вопрос

Поле объявлено volatile int count. Десять потоков делают count++ по 1000 раз. Каким будет итог?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Может быть меньше 10000: volatile не делает инкремент атомарным. count++ это три операции: прочитать, прибавить, записать. volatile гарантирует, что каждый поток читает свежее значение, но между чтением и записью другой поток успевает записать своё, и инкремент теряется.

Варианты ответа

  1. Ровно 10000: volatile делает операции над полем атомарными
  2. Может быть меньше 10000: volatile не делает инкремент атомарнымправильный ответ
  3. Ровно 10000, но только на многоядерных процессорах с кешем
  4. Всегда 1000: каждый поток видит и меняет своё значение поля

Разбор

count++ это три операции: прочитать, прибавить, записать. volatile гарантирует, что каждый поток читает свежее значение, но между чтением и записью другой поток успевает записать своё, и инкремент теряется. Нужен AtomicInteger.incrementAndGet(), LongAdder или synchronized. Версия «всегда 1000» неверна: потоки видят общее поле, просто теряют обновления.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме