Непоследовательные результаты с потоками java

У меня есть класс потока, который реализует runnable и счетчик int в качестве переменной экземпляра. Два синхронизированных метода add и sub. Когда я запускаю свой тестовый класс, он почему-то печатает неправильные результаты раз в несколько раз. Насколько я понимаю, когда метод синхронизируется, весь объект блокируется для доступа других потоков, и с такой логикой каждый раз мы должны получать одинаковые результаты, верно? Но почему-то этого не происходит. Я что-то упускаю?

Моя машина - Windows 7, 64 бит.

 public class ThreadClass implements Runnable {

        int counter = 0;

        @Override
        public void run() {
            add();
            sub();
        }

        public synchronized void add() {
            System.out.println("ADD counter" + (counter = counter + 1));
        }

        public synchronized void sub() {
            System.out.println("SUB counter" + (counter = counter - 1));
        }
    }

Тестовый класс

public class ThreadTest {

    public static void main(String args[]) {
        ThreadClass tc = new ThreadClass();
        Thread tc0 = new Thread(tc);
        tc0.start();
        tc0.setPriority(Thread.MAX_PRIORITY);
        Thread tc1 = new Thread(tc);
        tc1.start();
        tc1.setPriority(Thread.NORM_PRIORITY);
        Thread tc2 = new Thread(tc);
        tc2.start();
        tc2.setPriority(Thread.MIN_PRIORITY);
    }
}

Результаты

ADD counter1
ADD counter2
SUB counter1
SUB counter0
ADD counter1
SUB counter0

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

6
задан Edward Thomson 10 January 2012 в 23:05
поделиться