получение противоречивого / неправильного вывода в программе Multi-Threading Java - PullRequest
0 голосов
/ 03 сентября 2010
/*
This should always produce 0 as output since all three methods increment(), decrement(), value()  are thread safe(synchronized).  but it is returning 1
*/

class Counter implements Runnable {
    private int c = 0;

    public  synchronized void increment() {
        c++;
    }
    public synchronized void decrement() {
        c--;
    }
    public synchronized int value() {
        return c;
    }
    public void run() {
        try {
            this.increment();
            Thread.sleep(1000);
            this.decrement();
            Thread.sleep(1000);
            this.increment();
            Thread.sleep(1000);
            this.decrement();
            Thread.sleep(1000);
        }
        catch (InterruptedException e){
            return;
        }
    }
    public static void main(String args[]) throws InterruptedException {
       Counter c =  new Counter();
       new Thread(c).start();
       new Thread(c).start();
       System.out.println(c.value());
    }

}

Ответы [ 4 ]

6 голосов
/ 03 сентября 2010

, как и все остальные, сказал, что вам нужно убедиться, что шаги завершены, для этого вам нужно вызвать join .например

public static void main(String args[]) throws InterruptedException {
   Counter c =  new Counter();
   Thread t1 = new Thread(c).start();
   Thread t2 = new Thread(c).start();
   t1.join();
   t2.join();
   System.out.println(c.value());
}

, который должен работать правильно

4 голосов
/ 03 сентября 2010

Управлять, когда основной поток вызывает value(), нечего.Он запустится, как только сможет установить блокировку на c, даже если другие потоки все еще работают.

Если вы хотите дождаться завершения потоков, вызовите для них join().

1 голос
/ 03 сентября 2010

Вы не дожидаетесь завершения потоков, поэтому в результате значение c будет напечатано независимо от того, какой оно будет в эту секунду.Бьюсь об заклад, если бы вы попробовали это 1000 раз, бывали случаи, когда их не было 1.

У IBM есть хорошее руководство по ситуации, с которой вы столкнулись: http://publib.boulder.ibm.com/infocenter/iseries/v5r3/index.jsp?topic=/rzahw/rzahwex3rx.htm

1 голос
/ 03 сентября 2010

Вы читаете значение до того, как потоки закончили выполнение, поэтому оно может сильно отличаться от нуля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...