Я изучаю параллелизм и не совсем уверен, почему выходной сигнал изменяется, когда я перемещаю функцию printSuccess
за пределы блока synchronized
Я прочитал документацию по параллелизму Oracle и достаточно SOтемы, чтобы понять основные понятия и функциональность в игре. Однако я не могу объяснить этот эффект.
class ThreadTesting extends Thread {
volatile static int turn = 1;
public int id;
private static final Logger LOGGER = Logger.getLogger(ThreadTesting.class.getName());
public ThreadTesting(int id) {
this.id = id;
}
public void run() {
synchronized(this) {
if(id != turn) {
try {
wait();
} catch (InterruptedException e) {
LOGGER.info("Interrupted: " + id);
}
}
printSuccess(id);
}
}
public void printSuccess(int id) {
turn++;
System.out.println("Done:" + id);
notifyAll();
}
Я инициализирую набор вышеупомянутых объектов (с идентификаторами 1-n) и вызываю .start()
для каждого. Я ожидаю, что они все распечатали бы свои удостоверения личности в порядке. Однако результат неожиданно изменится, если я переместу функцию printSuccess()
за пределы блока synchronized
.
Заранее спасибо.