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
你不应该给两个线程都是相同的数组。