Как многопоточность влияет на функцию печати и когда она вызывается (Java) - PullRequest
0 голосов
/ 29 октября 2019

Я изучаю параллелизм и не совсем уверен, почему выходной сигнал изменяется, когда я перемещаю функцию 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.

Заранее спасибо.

...