Потоки. Почему при запуске из-под IDE и консоли — разные значения?

Хотел реализовать проблему "lost update".
Почему, когда я запускаю программу из под консоли - выдаёт значения от 1 миллиарда до 2 миллиард (как и ожидалось), а когда запускаю из под eclipse то постоянно получаю 1 миллиард ?

Исходный код
public class LostUpdate {
	private static int count;
	public static void main(String[] args)  {
		Thread th = new Thread(new Runnable(){
			@Override
			public void run() {
				for(int k = 0; k < 1_000_000_000; k++){
					count++;
				}
			}
		});
		th.start();
		for(int k = 0; k < 1_000_000_000; k++){
			count++;
		}
		try {
			th.join();
		} catch (InterruptedException ignore) {/*NOP*/}
		System.out.println(count);
	}
}
  • Вопрос задан
  • 2459 просмотров
Пригласить эксперта
Ответы на вопрос 1
@bimeg
В вашем примере кроме race condition (который вы ищете), присутствует еще и data race. При наличии data race компилятор (и не только) волен делать че угодно. Например заменить весь цикл на count = 1_000_000_000; Это не сломает intra-thread семантики. Если же поставить volatile на count то data race пропадает и остается только race condition. Тогда такие оптимизации запрещены и придется четсно выполнять что написано. Тогда можно получить любое значение из [2; 2_000_000_000].

Возможно както так. Весьма вероятно что я ошибаюсь.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы