Когда изменения в синхронизированном блоке видны другим потокам

Скажем, я обновляю значения двух переменных в синхронизированном методе. Возможно ли, чтобы новые значения, установленные в синхронизированном методе, были видны другим потокам до выхода из синхронизированного блока?

public synchronized void setValues(){
    a=5;
    // assume thread is preempted after this assignment
    // would the value 5 be visible to other threads?
    // my understanding is that the values will not be flushed to
    // main memory until the lock is released- i.e., until the synchronized
    // method is complete. So the changes will not be visible to other 
    // threads even when not using synchronization
    b=10;
}

Ниже метод не синхронизирован, поэтому я понимаю, что поток может видеть устаревшие значения. Мой вопрос: если поток вытесняется после присвоения a, возможно ли, чтобы новое значение "5" для переменной a было видно в методе printValues?

public void printValues() {
    System.out.println(a + " " + b);
}
10
задан Gray 25 April 2018 в 13:08
поделиться