这里是我的线程:为什么在这个java代码中没有竞争条件?
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然而,实际输出I得到的是:
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程序的添加操作似乎是原子即使我没有做任何锁定或同步?
结果中没有错误并不意味着没有(可能的)竞争条件。 – 2014-09-01 00:19:22
我跑了很多次这段代码,从来没有得到过比赛条件,但我觉得我没有那么幸运,不会在数十万次迭代中获得竞争条件。 – OneZero 2014-09-01 00:21:30
尝试增加迭代次数(可以说是'1000000'),并将打印语句移到循环之外(将它放在循环之后以增加竞争机会)。 – Pshemo 2014-09-01 00:23:24