【发布时间】:2014-09-01 00:17:03
【问题描述】:
这是我的主题:
public class MyRunnable implements Runnable
{
public static int num = 0;
private void add()
{
num = num + 1;
}
@Override
public void run()
{
for (int i=0;i<10000;i++)
{
add();
System.out.println(num);
}
}
}
这是我的主要内容:
public class MultiThread
{
public static void main(String[] argv)
{
Thread mt1 = new Thread(new MyRunnable(), "A");
Thread mt2 = new Thread(new MyRunnable(), "B");
mt1.start();
mt2.start();
}
}
我希望在那里看到竞态条件,因此输出应该小于 20000。但是,我得到的实际输出是:
19975
19976
19977
19978
19979
19980
19981
19982
19983
19984
19985
19986
19987
19988
19989
19990
19991
19992
19993
19994
19995
19996
19997
19998
19999
20000
Process finished with exit code 0
谁能向我解释为什么在这个 java 程序中添加操作似乎是原子的,即使我没有进行任何锁定或同步?
【问题讨论】:
-
结果中没有错误并不意味着没有(可能的)竞争条件。
-
我多次运行这段代码,从未遇到过竞态条件,但我认为在超过数十万次的迭代中没有获得竞态条件,我认为我没有那么幸运。跨度>
-
尝试增加迭代次数(让我们说
1000000)并将打印语句移到循环之外(将它放在它后面以增加竞争的机会)。 -
AtomicInt存在是有原因的!
标签: java multithreading parallel-processing