java线程效果和竞争条件

时间:2012-05-19 17:47:53

标签: java multithreading

  

可能重复:
  java threads effect on static classes

考虑以下代码:

    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个印刷数量的变化?

3 个答案:

答案 0 :(得分:0)

最大数量为10 + 9 + 8 + 7 + 6 + 5 + 4 + 3 +2 + 1; 让我们说一个线程执行10次写入1。 比具有值y [0] == 0的其他线程执行1次。 第一个线程可以再次从第二个线程停止的地方运行循环。

答案 1 :(得分: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

答案 2 :(得分:0)

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

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

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

++y[0];

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