【发布时间】:2017-11-25 17:25:32
【问题描述】:
我正在经历多线程中的竞态条件,并想创建一个导致竞态条件的情况,我为此编写了一个简单的程序,但每次都得到正确的结果。需要知道这是否是 Race 条件的正确情况。
代码如下:
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());
}
}
//在我的机器Win7 32bit中输出总是20。
【问题讨论】:
-
很有可能每个线程在这里做的工作太少以至于它们根本不重叠。
-
您正在等待所有 4 个线程完成(join() 方法),所以当然,一旦调用 println,内容总是 20。所以不,它不模拟比赛条件。
-
使涉及的数字更大。竞争条件是不可预测的,因此让每个线程花费更多时间会增加它发生的机会。
-
这是一个产生竞争条件的版本(至少在我的机器上):gist.github.com/jnizet/5a338e71282a249498ebc14736786c54
标签: java multithreading