-3

可能重复:
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 的最大和最小数量?什么可能导致打印的数量发生变化 1?

4

3 回答 3

0

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

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

while (y[0] < 10) 

每次同时,然后再次到达

++y[0];

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

于 2012-05-19T18:44:13.260 回答
0

最大数量为 10 + 9 + 8 + 7 + 6 + 5 + 4 + 3 +2 + 1;假设一个线程执行了 10 次写入 1。比另一个线程值 y[0] == 0 执行 1 次。第一个线程可以再次从第二个线程停止的地方运行最多 10 个循环。

于 2012-05-19T17:56:02.530 回答
0

首先,请参阅我对这个问题的评论。

    public void run() {
        x = 0;

        y[0] = 0;             // line a
        while (x< 10) {      
            ++x;
            System.out.print("0");
        }

        while (y[0] < 10) {   // line b
            ++y[0];
            System.out.print('1');
        }
    }

如果线程 A 和线程 B 同时到达line bline a,将打印10 个1。如果线程 A 正在运行它的循环并且y[0]刚刚递增到 10 但尚未测试真假,此时线程 B 到达line a并且它变为y[0]0,那么线程 A 获得了 10 次打印“1”的机会,所以计数是20

于 2012-05-19T18:23:53.380 回答