java线程对静态类的影响

时间:2012-05-19 10:26:41

标签: java multithreading

考虑以下代码:

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

3 个答案:

答案 0 :(得分:3)

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

  

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

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

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

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

  

注意该类是静态的

这门课程static是否与此完全无关。 All it meansThreadTest的实例没有对外部类的实例的隐式引用。它与ThreadTest实例之间的状态共享无关(我认为这就是你所暗示的)。

答案 1 :(得分:0)

1s的最小量显然为10,最大量为20。

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

while (y[0] < 10)
每次都在同一时间,然后再次到达

++y[0];

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

答案 2 :(得分:0)

班级是否static在这里没有任何作用。

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