2016-03-26 3 views
0

Вопрос, основанный на вопросе на Why does BufferedInputStream copy a field to a local variable rather than use the field directly.Точное значение и эффекты летучих в Java?

Один из ansers говорит это о «летучего» ключевое слово:

«Кроме того, он объявлен летучим, что означает, что если поток изменяет значение переменной, то это изменение будет немедленно отразится на всех другие темы ».

Это, по-видимому, предполагает, что если переменная NOT объявлена ​​изменчивой, тогда это не будет так, что «изменение будет немедленно отражено во всех других потоках» или «IOW», будут отражены изменения в переменной только позже".

Вопросы:

(а) в том, что понимание правильно? (b) Если да, то точно ARE изменяется, затем наносится/воздействует на другие потоки?

+2

Есть много существующих вопросов о SO по линиям «что означает летучие средние/делать?» - все ли они недостаточны? –

+0

О, - ваш реальный вопрос, похоже, «что такое поведение * энергонезависимых переменных?» - Это точно? –

ответ

1

Ключевое слово Java volatile используется для обозначения переменной/поля как хранимого в основной памяти и более точных слов, каждый раз, когда к переменной обращаются, она считывается/записывается в память основного компьютера, а не из/к кэшу ЦП.

В типичном применении многопоточного, при запуске много потоков, они могут сделать копию не-voalatile переменных из основной памяти в кэш процессора, следовательно, каждый поток будет иметь свою собственную копию переменная, и это в основном выполняется по соображениям производительности. Учитывая, что нет гарантии, когда JVM будет либо читать обратно обратно обратно переменным состоянием из/в основную память.

Ключевое слово volatile гарантирует, что переменная, помеченная этим модификатором, будет записана в основную память компьютера.