Следующий код показывает, как не работает условие гонки в потоке, но я не вижу разницы между синхронизированным и без него. Я думал, что счетчик статических переменных будет добавлен к 20000 в любом случае, но оказалось, что без синхронизированного счетчика будет меньше, чем 20000. Не могли бы вы объяснить, как работают потоки в этом случае? Кроме того, в Java потоки на самом деле не работают "одновременно", вместо этого они по очереди работают некоторое время?
public class NoRaceCondition implements Runnable {
private static int counter = 0;
private static Object gateKeeper = new Object();
public static void main(String[] args) {
Thread t1 = new Thread(new NoRaceCondition());
Thread t2 = new Thread(new NoRaceCondition());
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException e) { e.printStackTrace(); }
System.out.printf("counter = %d\n", counter);
}
public void run() {
synchronized (gateKeeper) {
for (int i = 0; i < 10000; i++) {
{
counter++;
}
}
}
}
}