這裏是我的線程:爲什麼在這個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