Рубрики

изменчивое ключевое слово в Java

Использование volatile — это еще один способ (как синхронизированная, атомарная оболочка) сделать поток класса безопасным. Потокобезопасность означает, что метод или экземпляр класса могут использоваться несколькими потоками одновременно без каких-либо проблем.

Рассмотрим ниже простой пример.

class SharedObj
{
   // Changes made to sharedVar in one thread
   // may not immediately reflect in other thread
   static int sharedVar = 6;
}

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

На диаграмме ниже показано, что если два потока выполняются на разных процессорах, то значение sharedVariable может отличаться в разных потоках.

Обратите внимание, что запись нормальных переменных без каких-либо действий по синхронизации может быть невидима для любого потока чтения (такое поведение называется последовательной согласованностью ). Хотя большинство современных аппаратных средств обеспечивают хорошую согласованность кэша, поэтому, скорее всего, изменения в одном кэше отражаются в другом, но не стоит полагаться на аппаратные средства для «исправления» неисправного приложения.

class SharedObj
{
   // volatile keyword here makes sure that
   // the changes made in one thread are 
   // immediately reflect in other thread
   static volatile int sharedVar = 6;
}

Обратите внимание, что volatile не следует путать со статическим модификатором. статические переменные являются членами класса, которые являются общими для всех объектов. В основной памяти есть только одна их копия.

энергозависимый и синхронизированный:
Прежде чем мы продолжим, давайте рассмотрим две важные особенности блокировок и синхронизации.

  1. Взаимное исключение: это означает, что только один поток или процесс может одновременно выполнять блок кода (критический раздел).
  2. Видимость : это означает, что изменения, внесенные одним потоком в совместно используемые данные, видны другим потокам.

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

В некоторых случаях мы можем только желать видимости, а не атомарности. Использование синхронизированных в такой ситуации является излишним и может вызвать проблемы с масштабируемостью. Здесь на помощь приходит волатильный. Изменчивые переменные обладают видимостью синхронизированных, но не атомарными функциями. Значения переменной volatile никогда не будут кэшироваться, и все операции записи и чтения будут выполняться в и из основной памяти. Тем не менее, использование летучих ограничено очень ограниченным набором случаев, поскольку в большинстве случаев желательно атомарность. Например, простой оператор приращения, такой как x = x + 1; или x ++ кажется отдельной операцией, но на самом деле представляет собой составную последовательность операций чтения-изменения-записи, которые должны выполняться атомарно.

изменчивый в Java против C / C ++:
Volatile в Java отличается от «volatile» в C / C ++ . Для Java «volatile» сообщает компилятору, что значение переменной никогда не должно кэшироваться, поскольку ее значение может изменяться вне области самой программы. В C / C ++ «volatile» требуется при разработке встроенных систем или драйверов устройств, где вам нужно читать или записывать отображаемое в память аппаратное устройство. Содержимое конкретного регистра устройства может измениться в любое время, поэтому вам нужно ключевое слово «volatile», чтобы компилятор не оптимизировал такой доступ.


Ссылки:

https://www.ibm.com/developerworks/java/library/j-jtp06197/
https://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html
http://tutorials.jenkov.com/java-concurrency/volatile.html
https://pveentjer.wordpress.com/2008/05/17/jmm-thank-god-or-the-devil-for-strong-cache-coherence/

Эта статья предоставлена Сулабхом Кумаром. Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме

Рекомендуемые посты:

изменчивое ключевое слово в Java

0.00 (0%) 0 votes