我正在經歷多線程中的競爭條件,並且想到創建導致競爭條件的情況,我爲此寫了一個簡單的程序,但每次都得到正確的結果。需要知道這是否是比賽狀況的正確情況。如下Java多線程競爭條件場景
代碼:
package com.threads;
/**
* demonstrate race conditions
*/
public class Step4 {
public int getA() {
return a;
}
public void addToA(int number) {
for(int i=0;i<number;i++)
this.a = this.a + 1;
}
int a = 2;
static Step4 s4 = new Step4();
public static void main(String[] args) throws InterruptedException {
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
s4.addToA(5);
}
});
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
s4.addToA(3);
}
});
Thread thread3 = new Thread(new Runnable() {
@Override
public void run() {
s4.addToA(6);
}
});
Thread thread4 = new Thread(new Runnable() {
@Override
public void run() {
s4.addToA(4);
}
});
thread1.start();
thread2.start();
thread3.start();
thread4.start();
thread1.join();
thread2.join();
thread3.join();
thread4.join();
System.out.println(s4.getA());
}
}
//輸出20總是在我的機器中,Win7 32位。
很可能每個線程在這裏做的工作很少,以至於它們根本不重疊。 –
您正在等待所有4個線程來完成(join()方法),所以當然,一旦** println **被調用,內容始終爲20.所以不,它不會模擬競態條件。 –
使涉及的數字更大。競爭條件是不可預測的,因此每個線程花費更多時間會增加發生的可能性。 – Kiskae