logo

Волатиле Кеиворд у Јави

Кључна реч Волатиле се користи за модификовање вредности променљиве различитим нитима. Такође се користи да би класе биле безбедне нити. То значи да више нити може користити метод и инстанцу класа у исто време без икаквих проблема. Кључна реч волатиле се може користити са примитивним типом или објектима.

Кључна реч волатиле не кешује вредност променљиве и увек чита променљиву из главне меморије. Кључна реч волатиле не може се користити са класама или методама. Међутим, користи се са променљивим. Такође гарантује видљивост и наручивање. То спречава компајлер да промени редослед кода.

оси модел слојева

Садржај регистра одређеног уређаја може се променити у било ком тренутку, тако да вам је потребна кључна реч волатиле да бисте обезбедили да такве приступе не оптимизује компајлер.

Пример

 class Test { static int var=5; } 

У горњем примеру, претпоставите да две нити раде на истој класи. Обе нити раде на различитим процесорима где свака нит има своју локалну копију вар. Ако било која нит измени своју вредност, промена се неће одразити на оригиналну у главној меморији. То доводи до недоследности података јер друга нит није свесна измењене вредности.

 class Test { static volatile int var =5; } 

У горњем примеру, статичке променљиве су чланови класе који се деле међу свим објектима. У главној меморији постоји само једна копија. Вредност променљиве променљиве никада неће бити сачувана у кешу. Читање и писање ће се вршити из главне меморије и у њу.

Када га користити?

  • Можете користити променљиву променљиву ако желите да аутоматски читате и пишете дугу и двоструку променљиву.
  • Може се користити као алтернативни начин за постизање синхронизације у Јави.
  • Све нити читача видеће ажурирану вредност променљиве променљиве након завршетка операције писања. Ако не користите кључну реч волатиле, различита нит читача може видети различите вредности.
  • Користи се да информише компајлер да ће више нити приступити одређеној изјави. То спречава компајлер да изврши било какво преуређивање или било какву оптимизацију.
  • Ако не користите волатиле променљиве, компајлер може да промени ред кода, слободно да упише у кеш вредност променљиве променљиве уместо читања из главне меморије.

Важне тачке

  • Можете користити кључну реч волатиле са променљивим. Коришћење кључне речи волатиле са класама и методама је незаконито.
  • То гарантује да ће вредност променљиве увек бити прочитана из главне меморије, а не из кеша локалне нити.
  • Ако сте декларисали променљиву као променљиву, Реад и Вритес су атомски
  • Смањује ризик од грешке у конзистентности меморије.
  • Свако писање у променљиву променљиву у Јави успоставља догађај пре односа са узастопним читањем те исте променљиве.
  • Променљиве варијабле су увек видљиве другим нитима.
  • Променљива променљива која је референца објекта може бити нула.
  • Када се променљива не дели између више нити, не морате да користите кључну реч волатиле са том променљивом.

Разлика између синхронизације и кључне речи волатиле

Волатиле кључна реч није замена за синхронизовану кључну реч, али се може користити као алтернатива у одређеним случајевима. Постоје следеће разлике:

Волатиле Кеиворд Кључна реч за синхронизацију
Кључна реч Волатиле је модификатор поља. Синхронизована кључна реч мења блокове кода и методе.
Нит се не може блокирати за чекање у случају нестабилности. Нити се могу блокирати за чекање у случају синхронизације.
Побољшава перформансе нити. Синхронизоване методе смањују перформансе нити.
Синхронизује вредност једне по једне променљиве између меморије нити и главне меморије. Он синхронизује вредности свих променљивих између меморије нити и главне меморије.
Нестална поља не подлежу оптимизацији компајлера. Синхронизација подлеже оптимизацији компајлера.

Пример несталне кључне речи

У следећем примеру смо дефинисали класу која повећава вредност бројача. Метода рун () у ВолатилеТхреад.јава добија ажурирану вредност и стару вредност када нит почне да се извршава. У главној класи дефинишемо низ нити.

ВолатилеДата.јава

јава логички стринг
 public class VolatileData { private volatile int counter = 0; public int getCounter() { return counter; } public void increaseCounter() { ++counter; //increases the value of counter by 1 } } 

ВолатилеТхреад.јава

 VolatileThread.java public class VolatileThread extends Thread { private final VolatileData data; public VolatileThread(VolatileData data) { this.data = data; } @Override public void run() { int oldValue = data.getCounter(); System.out.println('[Thread ' + Thread.currentThread().getId() + ']: Old value = ' + oldValue); data.increaseCounter(); int newValue = data.getCounter(); System.out.println('[Thread ' + Thread.currentThread().getId() + ']: New value = ' + newValue); } } 

ВолатилеМаин.јава

 public class VolatileMain { private final static int noOfThreads = 2; public static void main(String[] args) throws InterruptedException { VolatileData volatileData = new VolatileData(); //object of VolatileData class Thread[] threads = new Thread[noOfThreads]; //creating Thread array for(int i = 0; i <noofthreads; ++i) threads[i]="new" volatilethread(volatiledata); for(int i="0;" < noofthreads; threads[i].start(); starts all reader threads threads[i].join(); wait for } pre> <p> <strong>Output:</strong> </p> <pre> [Thread 9]: Old value = 0 [Thread 9]: New value = 1 [Thread 10]: Old value = 1 [Thread 10]: New value = 2 </pre> <hr></noofthreads;>