Выбор ответа Junior Потоки и Java Memory Model спрашивают часто обновлено
volatile и count++
Вопрос
Поле объявлено volatile int count. Десять потоков делают count++ по 1000 раз. Каким будет итог?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Может быть меньше 10000: volatile не делает инкремент атомарным. count++ это три операции: прочитать, прибавить, записать. volatile гарантирует, что каждый поток читает свежее значение, но между чтением и записью другой поток успевает записать своё, и инкремент теряется.
Варианты ответа
- Ровно 10000: volatile делает операции над полем атомарными
- Может быть меньше 10000: volatile не делает инкремент атомарнымправильный ответ
- Ровно 10000, но только на многоядерных процессорах с кешем
- Всегда 1000: каждый поток видит и меняет своё значение поля
Разбор
count++ это три операции: прочитать, прибавить, записать. volatile гарантирует, что каждый поток читает свежее значение, но между чтением и записью другой поток успевает записать своё, и инкремент теряется. Нужен AtomicInteger.incrementAndGet(), LongAdder или synchronized. Версия «всегда 1000» неверна: потоки видят общее поле, просто теряют обновления.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.