У меня есть класс потока, который реализует 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
Примечание: Возможно, вам придется выполнить несколько запусков, чтобы получить эту несогласованность.