Когда изменения в синхронизированном блоке видны другим потокам - PullRequest
10 голосов
/ 16 июня 2011

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

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);
}

Ответы [ 2 ]

13 голосов
/ 16 июня 2011

Да, изменения, внесенные в синхронизированные , могут (но не гарантированы) быть видимыми до того, как вы достигнете конца синхронизированного блока.По сути, вам обычно нужно синхронизировать (при одной и той же блокировке) при чтении или записи данных, чтобы получить согласованное представление о мире.

Гарантии, предоставляемые для синхронизации, заключаются в том, чтобы "делать правильные вещи »(синхронизировать должным образом) работают правильно - они не гарантируют, что изменения сделаны атомарно, когда вы не делаете правильные вещи (наблюдая за общими переменными без синхронизации).

Вы можете (до некоторой степени) считать записи в синхронизированном блоке аналогичными вызовам OutputStream.write(), а выход синхронизированного блока - вызовом flush().Когда вы проходите половину блока, некоторые данные, которые вы записали , могут попасть в выходной файл (или что-то еще), но они все еще могут быть буферизованы.Это не означает, что реализована модель памяти, это всего лишь аналогия, которая поможет вам понять, как видимость не гарантируется.

0 голосов
/ 16 июня 2011

synchronized не гарантирует, что значение a будет немедленно сброшено. Это будет, если a является летучим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...