Волатильное ключевое слово в многоядерном или одиночном процессоре?

java multithreading concurrency volatile

2480 просмотра

4 ответа

Я слышал, как многие говорили, что ключевое слово volatile имеет больше смысла в многоядерном процессоре, чем одноядерный, но не знает причины. Я пытался гуглить, но не помогло в этом аспекте. Есть ли причина для этого?

Согласно моему пониманию, ключевое слово volatile должно иметь одинаковое значение, будь то многоядерный или одиночный процессор. Причиной является volatile, гарантирующее, что значение будет обновляться в основной памяти (куче) вместо того, чтобы хранить его в локальной памяти потока (стеке), которую могут видеть все потоки. Так ли это многоядерный или одиночный процессор, как это имеет значение?

Автор: M Sach Источник Размещён: 12.11.2019 09:26

Ответы (4)


6 плюса

Решение

«Чувство изменчивости» не имеет ничего общего с количеством ядер. JVM скрывает основную архитектуру. Не говоря уже о том, что volatile - это ключевое слово языка, поэтому оно должно вести себя одинаково на всех архитектурах.

Вы описали, что делает volatile, и это правильно. Архитектура приложения , которые могут потребовать использование летучего, ничего другого.

Если вам интересно, вот отличный пост, связанный с volatile и основными понятиями модели памяти, используемой в Java.

http://jeremymanson.blogspot.hu/2008/11/what-volatile-means-in-java.html

Автор: kupsef Размещён: 11.05.2014 02:43

2 плюса

Прежде всего, «volatile» пытается уменьшить проблемы видимости, которые могут возникнуть в разных потоках (подумайте о локальных переменных / копиях общих переменных в каждой области потока). Тем не менее, уровень распараллеливания становится все проще и проще визуализировать, когда у вас несколько ядер ЦП (кеши, регистры). ИМО, поэтому это имеет больше смысла в многоядерных архитектурах. Тем не менее, эта проблема видимости может даже возникнуть, когда у вас одноядерный, несколько потоков, и два из них считывают одно и то же значение переменной один за другим, прежде чем другой обновит его. В любом случае, volatile будет работать одинаково независимо от одноядерной или многоядерной архитектуры.

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

Volatile только увеличивает вероятность синхронизации потоков, но это не гарантируется. Если у вас несколько потоков, обновление общих данных изменчивым может быть недостаточно в одиночку. Есть и другие функции, которыми вы можете воспользоваться с изменчивой концепцией. Пожалуйста, посмотрите здесь .

Автор: stdout Размещён: 03.08.2015 06:53

-2 плюса

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

Однако, если у вас одно ядро, то когда вы обновляете переменную, которая не является энергозависимой, если она обновляется в кеше ядра без переноса в основную память, это может быть хорошо, потому что все другие потоки работают на том же ядре, следовательно, будут видеть последнее значение, доступное в кэше, которое они все разделяют. Так что вам не нужно летучего там.

Автор: Ashwin Размещён: 08.07.2017 06:48

-3 плюса

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

Автор: Alexey Malev Размещён: 11.05.2014 01:45
32x32