Java 我不知道';在这种情况下,我们不知道线程是如何工作的
下面的代码显示了线程中的无竞争条件是如何工作的,但我不知道有同步和无同步的区别。我原以为静态变量计数器将被添加到20000,但结果表明,没有同步计数器将小于20000。你能解释一下在这种情况下线程是如何工作的吗?另外,在Java中,线程实际上不是“并发”运行,而是轮流运行一段时间Java 我不知道';在这种情况下,我们不知道线程是如何工作的,java,multithreading,concurrency,Java,Multithreading,Concurrency,下面的代码显示了线程中的无竞争条件是如何工作的,但我不知道有同步和无同步的区别。我原以为静态变量计数器将被添加到20000,但结果表明,没有同步计数器将小于20000。你能解释一下在这种情况下线程是如何工作的吗?另外,在Java中,线程实际上不是“并发”运行,而是轮流运行一段时间 public class NoRaceCondition implements Runnable { private static int counter = 0; private static Obj
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++;
}
}
}
}
}
public类NoRaceCondition实现可运行{
专用静态整数计数器=0;
私有静态对象网关守卫=新对象();
公共静态void main(字符串[]args){
线程t1=新线程(new noracecodition());
线程t2=新线程(新的NoRaceCondition());
t1.start();
t2.start();
试一试{
t1.join();
t2.连接();
}catch(InterruptedException e){e.printStackTrace();}
System.out.printf(“计数器=%d\n”,计数器);
}
公开募捐{
已同步(网守){
对于(int i=0;i<10000;i++){
{
计数器++;
}
}
}
}
}
您可以将count++
看作三个独立的步骤
count的值
count
count=1
设两个名为A
和B
线程A读取count
的值并获取1
线程B读取count
的值并获取1
线程A增加其值并得到2
线程B增加其值并得到2
线程A将值写入count
计数现在是2
线程B将值写入count
count
现在再次变为2,而在2次递增后,预计它将变为3
谢谢你的解释!