синхронизируется переменная переменная? (Джава) - PullRequest
8 голосов
/ 22 мая 2011

Скажите, что у меня есть приватная переменная, и у меня есть метод setVariable() для нее, который synchronized, разве это не то же самое, что использование модификатора volatile?

Ответы [ 6 ]

7 голосов
/ 22 мая 2011

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

4 голосов
/ 27 октября 2012

Нет, вызов метода synchronized getXXX / setXXX - это не то же самое, что чтение / запись в переменную volatile.

Несколько потоков могут одновременно выполнять чтение или запись в переменную volatile.Но только один поток может одновременно читать или записывать переменную, которая защищена блоком synchronized.

1 голос
/ 22 мая 2011

volatile переменные не синхронизированы (по крайней мере, не так, как synchronized материал синхронизирован). Что делает volatile, так это гарантирует, что переменная извлекается при каждом ее использовании (то есть: она предотвращает определенные виды оптимизации), и IIRC, что она читается и записывается в правильном порядке. Это может предположительно эмулировать некоторые виды синхронизации, но это не может работать так же, если ваш установщик должен установить более одной вещи. (Например, если вы установите две volatile переменные, будет точка, в которой одна из них установлена, а другая - нет.)

0 голосов
/ 03 июня 2014

Нет никакого отношения.

В основном

  • Volatile => всегда получает последнее значение параметра
  • Synchronized => одновременно обслуживает только 1 поток
0 голосов
/ 22 мая 2011

только пример:

First thread run  :
while(stopped){
 ... do something
}

Second thread run :
stopped = true;

полезно объявить остановленный как логическое значение volatile, чтобы первый поток имел новое значение.

0 голосов
/ 22 мая 2011

На самом деле нет.volatile на самом деле является более слабой формой синхронизации, когда поле объявлено как volatile, компилятор и среда выполнения понимают, что этот variable является общим, и операции над ним не должны переупорядочиваться с другими операциями с памятью.Изменчивые переменные не кэшируются в регистрах или в кэшах, где они скрыты от других процессоров, поэтому чтение переменной volatile всегда возвращает недавнюю запись любым потоком.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...