以下代码显示了线程中没有竞争条件的工作原理,但是同步和不同步都没有区别。我认为静态变量计数器无论如何都将添加到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++;
}
}
}
}
}
答案 0 :(得分:1)
您可以将count++
视为3个单独的步骤。
count
的值count
当多个线程同时执行上述步骤时,可能会出现竞争条件。种族条件的一个例子是
让
count = 1
让两个线程分别名为
A
和B
线程A读取
count
的值并获得1
线程B读取
count
的值并获得1
线程A的值递增并获得2
线程B的值递增并获得2
线程A将值写入
count
count
现在是2线程B将值写入
count
count
现在又变为2了,它预期在2增量后为3