Ключевое слово volatile в java

Ключевое слово volatile используется для изменения значения переменной различными потоками. Он также используется, чтобы сделать классы потокобезопасными.

Это означает, что несколько потоков могут использовать метод и экземпляр классов одновременно без каких-либо проблем. Ключевое слово volatile в Java может использоваться как с примитивным типом, так и с объектами.

Пример

class Test
{
static int var=5;
}

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

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

class Test
{
static volatile int var =5;
}

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

Разница между Synchronization и Volatile

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

Volatile Synchronization Ключевое Слово
Ключевое слово Volatile-это модификатор поля. Изменяет блоки кода и методы.
The thread cannot be blocked for waiting in case of volatile. Потоки могут быть заблокированы для ожидания в случае синхронизации.
It improves thread performance. Синхронизированные методы снижают производительность потока.
It synchronizes the value of one variable at a time between thread memory and main memory. Синхронизирует значения всех переменных между памятью потока и основной памятью.
Volatile fields are not subject to compiler optimization. Синхронизация подлежит оптимизации компилятором.

Пример:

public class VolatileTest {
private static final Logger LOGGER = MyLoggerFactory.getSimplestLogger();
private static volatile int MY_INT = 0;
public static void main(String[] args) {
new ChangeListener().start();
new ChangeMaker().start();
}
static class ChangeListener extends Thread {
@Override
public void run() {
int local_value = MY_INT;
while ( local_value < 5){
if( local_value!= MY_INT){
LOGGER.log(Level.INFO,"Got Change for MY_INT : {0}", MY_INT);
local_value= MY_INT;
}
}
}
}
static class ChangeMaker extends Thread{
@Override
public void run() {
int local_value = MY_INT;
while (MY_INT <5){
LOGGER.log(Level.INFO, "Incrementing MY_INT to {0}", local_value+1);
MY_INT = ++local_value;
try {
Thread.sleep(500);
} catch (InterruptedException e) { e.printStackTrace(); }
}
}
}
}

пример Volatile

Оцените статью