Я утверждаю, что минимально возможное значение равно 2.
Ключом к этому является неатомичность num++
, т. Е. Это чтение и запись, которые могут иметь другие операции между ними.
Вызовите потоки T1..T5:
- T1 читает 0, T2 читает 0;
- T1 пишет 1, а затем читает и пишет 3 раза.
- Затем T2 пишет 1;
- Затем T1 читает 1;
- Затем T2-5 выполняет всю свою работу
- Затем, наконец, T1 пишет 2.
(Примечание: результат 2 не зависит ни от количества потоков, ни от числа итераций, если их не менее 2).
Но честноОтвет на это: это действительно не имеет значения.Существует гонка данных, как определено в JLS 17.4.5 :
Когда программа содержит два конфликтующих доступа (§17.4.1), которые не упорядочены случаем-перед связью говорят, что она содержит гонку данных .
(отсутствует связь между событиями в потоках между и "1035")
Так что вы не можете с пользой полагаться на то, что он делает.Это просто неверный код.
(Более того, я знаю ответ на этот вопрос не из-за с трудом выигранной многопоточной кодовой отладки или глубокого технического чтения: я знаю это, потому что я читал этот ответ раньше, чем где-либо еще.Это хитрый прием, ничего более, и поэтому задание минимального значения не очень хороший вопрос для интервью).