考虑以下代码:
static class ThreadTest extends Thread {
int x;
int[] y;
public ThreadTest(int x, int[] y) {
this.x = x;
this.y = y;
}
@Override
public void run() {
while (x< 10) {
++x;
System.out.print("0");
}
while (y[0] < 10) {
++y[0];
System.out.print('1');
}
}
}
public static void main(String args[]) {
int x = 0;
int[] y = new int[1];
y[0] = 0;
Thread A = new ThreadTest(x, y);
Thread B = new ThreadTest(x, y);
B.start();
A.start();
}
显然存在竞争条件。我如何评估将要打印的1的最大和最小数量? 什么可能导致1个印刷数量的变化?
答案 0 :(得分:0)
最大数量为10 + 9 + 8 + 7 + 6 + 5 + 4 + 3 +2 + 1; 让我们说一个线程执行10次写入1。 比具有值y [0] == 0的其他线程执行1次。 第一个线程可以再次从第二个线程停止的地方运行循环。
答案 1 :(得分:0)
首先,请看我对这个问题的评论。
public void run() {
x = 0;
y[0] = 0; // line a
while (x< 10) {
++x;
System.out.print("0");
}
while (y[0] < 10) { // line b
++y[0];
System.out.print('1');
}
}
如果线程A和线程B分别在同一时刻到达line b
和line a
,则会打印 10 1。如果线程A正在运行它的循环并且y[0]
刚刚增加到10但尚未测试真/假,并且此时线程B到达line a
,它会更改y[0]
为0,然后线程A再获得10次打印“1”的机会,因此计数 20 。
答案 2 :(得分:0)
1s的最小量显然为10,最大量为20。
20因为最糟糕的情况是两个线程都到达
while (y[0] < 10)
每次都在同一时间,然后再次到达
++y[0];
每次都在同一时间,这将使其中一个增量丢失。