Если энергозависимые поля считываются непосредственно из памяти, откуда считываются энергонезависимые поля? - PullRequest
0 голосов
/ 10 мая 2019

Я недавно читал, что volatile поля являются поточно-ориентированными, потому что

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

Таким образом, я задался вопросом о энергонезависимых полях, откуда поток будет считать свое значение?Я думал, что все было сохранено в памяти.

Ответы [ 3 ]

0 голосов
/ 10 мая 2019

Каждый поток имеет кэш основной памяти.

Поле может быть объявлено как volatile, и в этом случае Java Memory Model гарантирует, что все потоки увидят согласованное значение для переменной

Например, у нас есть этот статический счетчикэто не потокобезопасно

static int counter = 0;

Если два потока читают и записывают эту переменную, это будет выглядеть так:

Main memory  - > static int counter 
T1-> Cache of the Main Memory. Reads/Writes directly from Cache
T2-> Cache of the Main Memory. Reads/Writes directly from Cache 

Так что это будет противоречиво при чтении и записи.

static volatile int counter = 0;

Main Memory - > static int counter;
T1 - > Read and Writes directly from the memory
T2 - > Read and Writes directly from the memory

Я надеюсь дать вам простое резюме по этому поводу.Потому что вам нужно проверить больше о параллелизме и Атомный доступ для параллелизма переменных. Проверьте больше в Java Docs

0 голосов
/ 10 мая 2019

Энергонезависимые переменные обычно хранятся в кэше процессора ( на поток ) и только периодически обновляются в основной памяти.

Модификатор volatile означает, что данные переменных хранятся в основной памятикаждый раз, когда он изменяется и, следовательно, всегда актуален, когда другой поток должен получить к нему доступ / редактировать.

0 голосов
/ 10 мая 2019

Заявление, которое вы цитируете, является заблуждением.Я рекомендую следующую статью: https://software.rajivprab.com/2018/04/29/myths-programmers-believe-about-cpu-caches/

, если бы переменные переменные действительно записывались / читались из основной памяти каждый раз, они были бы ужасно медленными - ссылки на основную память в 200 раз медленнее, чем кэш L1Рекомендации.В действительности, volatile-чтение (в Java) часто может быть таким же дешевым, как ссылка на кэш L1, оставляя в стороне представление о том, что volatile заставляет читать / записывать всю дорогу в основную память.Если вы избегали использования летучих веществ из-за проблем с производительностью, возможно, вы стали жертвой вышеуказанных заблуждений.

...