java线程对静态类的影响

考虑以下代码:

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”的最大和最小外观?

目前,您的代码包含竞争条件,因为两个线程正在修改相同的y数组。 这意味着打印的1的数量是不确定的。

每次程序运行时,如何确保1的数量相同?

您需要在两个线程之间引入同步。

这可以通过多种方式完成。 Java中最常见的一种是在修改和/或读取共享状态的代码周围使用synchronized块。

另一种方法是用单个AtomicInteger替换int[1]数组。 对于这种特殊情况,这将非常有效。

注意这个类是静态的

这个类是否是static这里完全无关紧要。 这意味着 ThreadTest一个实例没有对外部类的实例的隐式引用。 它与ThreadTest实例之间的状态共享无关(我认为这就是你在这里所暗示的)。

最小1s显然是10,最大数量是20。

因为最糟糕的情况是两个线程都会到达

 while (y[0] < 10) 

每次都在同一时间,然后再次到达

 ++y[0]; 

也是每次都在同一时间,这将使其中一个增量丢失。

这个类是否是static并不起任何作用。

虽然ThreadTest.y变量不是静态的(并且它不应该是),但它为所有线程填充了对同一数组引用 。 这就是你的同步错误所在:在main你不应该给两个线程都是相同的数组。