Я пробую классический приращение / уменьшение переменной int в многопоточной среде.Это мой пример кода.
public class SyncIncDec {
public static void main(String[] args) {
SyncCounter count = new SyncCounter();
Thread incThread = new Thread(() -> {
count.increment();
});
Thread decThread = new Thread(() -> {
count.decrement();
});
Thread displayThread = new Thread(() -> {
System.out.println("Count value : " + count.getX());
});
incThread.start();
decThread.start();
displayThread.start();
try {
incThread.join();
} catch (InterruptedException e) {
// e.printStackTrace();
}
try {
decThread.join();
} catch (InterruptedException e) {
// e.printStackTrace();
}
try {
displayThread.join();
} catch (InterruptedException e) {
// e.printStackTrace();
}
}
}
class SyncCounter {
private int x=0;
public SyncCounter() {
super();
}
public SyncCounter(int y) {
super();
x = y ;
}
synchronized int getX() {
return x;
}
void setX(int y) {
x = y ;
}
void increment() {
++x;
}
void decrement() {
--x;
}
}
Хотя я использовал метод join () для всех трех потоков, я все же получаю противоречивые результаты.Не означает ли присоединение здесь, что основной поток ожидает, пока каждый поток не завершит свое выполнение?Я даже попытался добавить синхронизированный к каждой из трех сигнатур метода;все же я получаю противоречивые результаты.
Кроме использования атомной версии переменной, как еще я могу гарантировать, что получаю 0 всегда?