Результат не гарантированно равен 10000: counter++ не атомарен, и потоки могут терять обновления. join обеспечивает завершение и видимость, но не исправляет гонку инкремента.
class Task {
Результат не гарантированно равен 10000: counter++ не атомарен, и потоки могут терять обновления. join обеспечивает завершение и видимость, но не исправляет гонку инкремента.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
class Task {
private static int counter = 0;
public static void main(String[] args) throws Exception {
var thread1 = new Thread(() -> increase());
var thread2 = new Thread(() -> increase());
thread1.start();
thread2.start();
thread1.join();
thread2.join();
System.out.println(counter);
}
private static void increase() {
for (int i = 0; i < 5000; i++) {
counter++;
}
}
}
Ответ
Результат не гарантированно равен 10000: counter++ не атомарен, и потоки могут терять обновления. join обеспечивает завершение и видимость, но не исправляет гонку инкремента.
Исправление через AtomicInteger:
private static final AtomicInteger counter = new AtomicInteger();
private static void increase() {
for (int i = 0; i < 5000; i++) {
counter.incrementAndGet();
}
}
После обоих join печатают counter.get(), получая 10000. Нужен импорт java.util.concurrent.atomic.AtomicInteger. Альтернатива — один общий lock вокруг изменения; volatile int недостаточен, поскольку видимость не превращает read-modify-write в одну операцию.