0

考虑以下代码:

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

4

3 回答 3

3

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

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

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

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

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

注意这个类是静态的

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

于 2012-05-19T10:29:37.853 回答
0

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

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

while (y[0] < 10)

每次同时,然后再次到达

++y[0];

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

于 2012-05-19T20:52:35.337 回答
0

该类是否static在此处不起作用。

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

于 2012-05-20T09:34:09.157 回答