考虑以下代码:
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和多少个0? 每次程序运行时,如何确保1的数量相同? 请注意,该课程是静态
如何评估“1”的最大和最小外观?
答案 0 :(得分:3)
目前,您的代码包含race condition,因为两个线程正在修改相同的y
数组。这意味着打印的1的数量是不确定的。
每次程序运行时,如何确保1的数量相同?
您需要在两个线程之间引入同步。
这可以通过多种方式完成。 Java中最常见的一种是在修改和/或读取共享状态的代码周围使用synchronized
块。
另一种方法是用AtomicInteger
替换int[1]
数组。对于这种特殊情况,这将非常有效。
注意该类是静态的
这门课程static
是否与此完全无关。 All it means是ThreadTest
的实例没有对外部类的实例的隐式引用。它与ThreadTest
实例之间的状态共享无关(我认为这就是你所暗示的)。
答案 1 :(得分:0)
1s的最小量显然为10,最大量为20。
20因为最糟糕的情况是两个线程都到达
while (y[0] < 10)
每次都在同一时间,然后再次到达
++y[0];
每次都在同一时间,这将使其中一个增量丢失。
答案 2 :(得分:0)
班级是否static
在这里没有任何作用。
虽然ThreadTest.y
变量不是静态的(并且它不应该是),但是对于所有线程,它都填充了对同一数组的引用。这就是您的同步错误所在:在main
中,您不应该为两个线程提供相同的数组。