Волатильное ключевое слово в многоядерном или одиночном процессоре?
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:432 плюса
Прежде всего, «volatile» пытается уменьшить проблемы видимости, которые могут возникнуть в разных потоках (подумайте о локальных переменных / копиях общих переменных в каждой области потока). Тем не менее, уровень распараллеливания становится все проще и проще визуализировать, когда у вас несколько ядер ЦП (кеши, регистры). ИМО, поэтому это имеет больше смысла в многоядерных архитектурах. Тем не менее, эта проблема видимости может даже возникнуть, когда у вас одноядерный, несколько потоков, и два из них считывают одно и то же значение переменной один за другим, прежде чем другой обновит его. В любом случае, volatile будет работать одинаково независимо от одноядерной или многоядерной архитектуры.
Ключ к пониманию того, что ваши изменчивые переменные в кэше ЦП или регистры будут записаны обратно в основную память с помощью политики записи IMMEDIATE, поэтому при любых последующих чтениях этой же переменной будет считываться последнее обновленное значение.
Volatile только увеличивает вероятность синхронизации потоков, но это не гарантируется. Если у вас несколько потоков, обновление общих данных изменчивым может быть недостаточно в одиночку. Есть и другие функции, которыми вы можете воспользоваться с изменчивой концепцией. Пожалуйста, посмотрите здесь .
Автор: stdout Размещён: 03.08.2015 06:53-2 плюса
Насколько я понимаю, энергозависимость не имеет отношения к одноядерному. Обновления изменчивых переменных выталкиваются / считываются из основной памяти, что важно в многоядерной архитектуре, где каждое ядро может иметь свой собственный кэш, поэтому обновление в кеше конкретного ядра может не отображаться для других потоков, работающих на другом ядре.
Однако, если у вас одно ядро, то когда вы обновляете переменную, которая не является энергозависимой, если она обновляется в кеше ядра без переноса в основную память, это может быть хорошо, потому что все другие потоки работают на том же ядре, следовательно, будут видеть последнее значение, доступное в кэше, которое они все разделяют. Так что вам не нужно летучего там.
Автор: Ashwin Размещён: 08.07.2017 06:48-3 плюса
Ваше понимание верно. volatile
Ключевое слово не имеет смысла в однопоточном приложении, независимо от того, работает оно на одноядерном или многоядерном процессоре, поскольку volatile
переменная гарантирует изменения, видимые потокам . Если вы этого не сделаете, скорее всего, у вас будут проблемы с видимостью даже в одноядерной среде. В случае многопоточного приложения, работающего в одноядерном или многоядерном окружении, бывают случаи, когда вам нужны volatile
переменные (или другие способы или гарантии синхронизации / видимости).
Вопросы из категории :
- java В чем разница между int и Integer в Java и C #?
- java Как я могу определить IP моего маршрутизатора / шлюза в Java?
- java Каков наилучший способ проверки XML-файла по сравнению с XSD-файлом?
- java Как округлить результат целочисленного деления?
- java Преобразование списка <Integer> в список <String>
- multithreading Что такое состояние гонки?
- multithreading Что такое тупик?
- multithreading Что такое мьютекс?
- multithreading Как начать потоки в plain C?
- multithreading Потокобезопасный foreach перечисление списков
- concurrency Безопасно ли получать значения из java.util.HashMap из нескольких потоков (без изменений)?
- concurrency Вы когда-нибудь использовали ключевое слово volatile в Java?
- volatile Почему летучие существуют?
- volatile Летучие против блокировки против блокировки
- volatile почему локальная переменная не может быть изменчивой в C #?
- volatile Volatile vs Static в Java