logo

Java Atomic

Java nyelven, atomi változók és tevékenységek párhuzamosan használják. A többszálú környezet problémához vezet, amikor párhuzamosság egységes. A megosztott entitások, például objektumok és változók a program végrehajtása során változhatnak. Ezért a program következetlenségéhez vezethetnek. Ezért fontos, hogy gondoskodjunk a megosztott entitásról, miközben egyidejűleg hozzáférünk. Ilyen esetekben a atomi változó megoldás lehet rá. Ebben a részben megvitatjuk atomi osztályok, atomi változók, atomi műveletek , példákkal együtt.

reguláris kifejezés java-ban

Mielőtt továbblép ebben a részben, győződjön meg arról, hogy tisztában van a következőkkel cérna , szinkronizálás , és zár Java nyelven.

Java Atomic osztályok

Jáva biztosítja a java.util.concurrent.atomic csomag, amelyben atomi osztályok vannak meghatározva. Az atomi osztályok biztosítják a zármentes és cérnabiztos környezet vagy programozás egyetlen változón. Támogatja az atomi műveleteket is. Minden atomi osztály rendelkezik a get() és set() metódusokkal, amelyek az illékony változón működnek. A módszer ugyanúgy működik, mint az illékony változókon való olvasás és írás.

A csomag a következő atomi osztályokat tartalmazza:

Osztály Leírás
AtomicBoolean A logikai érték atomi frissítésére szolgál.
AtomicInteger Az egész értékek atomos frissítésére szolgál.
AtomicIntegerArray Int tömb, amelyben az elemek atomszerűen frissíthetők.
AtomicIntegerFieldUpdater Reflexió-alapú segédprogram, amely lehetővé teszi a kijelölt osztályok kijelölt illékony int mezőinek atomi frissítését.
AtomicLong A hosszú érték atomi frissítésére szolgál.
AtomicLongArray Hosszú tömb, amelyben az elemek atomszerűen frissíthetők.
AtomicLongFieldUpdater Reflexió-alapú segédprogram, amely lehetővé teszi a kijelölt osztályok kijelölt illékony hosszú mezőinek atomi frissítését.
AtomicMarkableReference Az AtomicMarkableReference egy objektumhivatkozást tart fenn egy jelölőbittel együtt, amely atomosan frissíthető.
AtomicReference Objektumhivatkozás, amely atomosan frissíthető.
AtomicReferenceArray Objektumhivatkozások tömbje, amelyben az elemek atomszerűen frissíthetők.
AtomicReferenceFieldUpdater Reflexió-alapú segédprogram, amely lehetővé teszi a kijelölt osztályok kijelölt illékony referenciamezőinek atomi frissítését.
AtomicStampedReference Az AtomicStampedReference egy objektumhivatkozást tart fenn egy egész „bélyegzővel”, amely atomosan frissíthető.
DoubleAccumulator Egy vagy több változó, amelyek együtt fenntartanak egy futó kettős értéket, amelyet a mellékelt függvény segítségével frissítenek.
DoubleAdder Egy vagy több változó, amelyek együttesen egy kezdetben nulla dupla összeget tartanak fenn.
LongAccumulator Egy vagy több változó, amelyek együtt fenntartanak egy futó hosszú értéket, amelyet a mellékelt függvény segítségével frissítenek.
LongAdder Egy vagy több változó, amelyek együttesen egy kezdetben nulla hosszú összeget tartanak fenn.

Ezen osztályok objektumai az atomi változót képviselik int, hosszú, logikai , és objektum referencia illetőleg. Az atomi osztályoknak van néhány közös módszere, amelyek a következők:

Mód Leírás
készlet() Az érték beállítására szolgál.
kap() Az aktuális érték lekérésére szolgál.
lazySet() Végül beállítja a megadott értéket.
ÖsszehasonlításAndSet Atomikusan beállítja az értéket a megadott frissített értékre, ha az aktuális érték == a várt érték.

Atomműveletek

Azokat a műveleteket, amelyek mindig együtt hajtódnak végre, a atomi műveletek vagy atomi cselekvés . Az összes hatékonyan végrehajtott atomi művelet egyszerre történik, vagy egyáltalán nem történik meg. Három A Java atomi műveleteihez kapcsolódó kulcsfogalmak a következők:

1. Az atomitás azzal foglalkozik, hogy mely cselekvések és cselekvések halmazai vannak láthatatlan Vegyük például a következő kódrészletet:

 class NoAtomicOps { long counter=0; void increment() { for(;;) { count++; } } void decrement() { for(;;) { count--; } } //other statement } 

A fenti kódban az increment() és a decrement() egyidejű futtatása a következő határozatlan és nem kiszámítható .

2. A láthatóság határozza meg, hogy mikor lehet egy szál hatása látott egy másik által. Vegyük például a következő kódrészletet:

 class InfiniteLoop { boolean done= false; void work() { //thread T2 read while(!done) { //do work } } void stopWork() { //thread T1 write done=true; } //statements } 

A fenti kódban lehetséges, hogy a T2 szál soha nem áll le, még akkor sem, ha a T1 szálat igazra állítja. Azt sem, hogy ne lenne szinkronizálás a szálak között.

3. A sorrend határozza meg, hogy az egyik szálban mikor történnek műveletek a másik szálhoz képest.

 class Order { boolean a=false; boolean b=false; void demo1() //thread T1 { a=true; b=true; } boolean demo2() //thread T2 { boolean r1=b; //sees true boolean r2=a; //sees false boolean r3=a; //sees true //returns true return (r1 && !r2) && r3; } } 

Az a és b mezők megjelenési sorrendje a T2 szálban eltérhet a T1 szálban beállított sorrendtől.

tömbök java-ban

Értsük meg egy példán keresztül.

 public class AtomicExample { int count; public void incrementCount() { count=1; } 

A fenti kódrészletben deklaráltunk egy int típusú változót számol és az incrementCount() metóduson belül 1-hez rendelte. Ebben az esetben vagy minden együtt történik, vagy egyáltalán nem. Ennélfogva egy atomi működés és a művelet ún atomos állapot .

Nézzünk egy másik kódrészletet.

 public class AtomicExample { int count; public void incrementCount() { count=count+1; } 

Úgy tűnik, hogy ez is egy atomi művelet, de nem az. Ez egy lineáris művelet, amely három műveletből áll, azaz olvasásból, módosításból és írásból. Ezért részben végrehajtható. De ha a fenti kódot többszálú környezetben használjuk, az problémát okoz.

Tegyük fel, hogy a fenti kódot egyszálú környezetben hívtuk meg, a count frissített értéke 2 lesz. Ha a fenti metódust két külön szálon keresztül hívjuk, akkor mindkettő egyszerre éri el a változót, és frissíti a változó értékét is. egyszerre számolni. Ennek elkerülésére atomi műveletet alkalmazunk.

iterátor java térkép

A Java többféle atomi műveletet támogat, amelyek a következők:

  • Illó változók
  • Alacsony szintű atomi műveletek (nem biztonságos)
  • Atomosztályok

Nézzük meg, hogyan hozhatunk létre atomi műveletet.

Atomváltozó

Az atomi változó lehetővé teszi, hogy atomi műveletet hajtsunk végre egy változón. Az atomi változók minimalizálják a szinkronizálást, és segítenek elkerülni a memória-konzisztencia hibákat. Így ez biztosítja a szinkronizálást.

Az atomcsomag a következő öt atomi változót tartalmazza:

  • AtomicInteger
  • AtomicLong
  • AtomicBoolean
  • AtomicIntegerArray
  • AtomicLongArray

Az atomi változó igénye

Tekintsük a következő kódot.

Counter.java

 class Counter extends Thread { // Counter Variable int count = 0; //the method starts the execution of a thread public void run() { int max = 1; //increments the counter variable up to specified max time for (int i = 0; i <max; i++) { count++; } public class counter static void main(string args[]) throws interruptedexception creating an instance of the c="new" counter(); four threads thread t1="new" thread(c, 'first'); t2="new" 'second'); t3="new" 'third'); t4="new" 'fourth'); by calling start() method, we have started t1.start(); t2.start(); t3.start(); t4.start(); main will wait for all until execution do not complete t1.join(); t2.join(); t3.join(); t4.join(); prints final value count variable system.out.println(c.count); < pre> <p> <strong>Output:</strong> </p> <pre> 4 </pre> <p>The above program gives the expected output if it is executed in a single-threaded environment. A multi-threaded environment may lead to unexpected output. The reason behind it that when two or more threads try to update the value at the same time then it may not update properly.</p> <p>Java offers <strong>two</strong> solutions to overcome this problem:</p> <ul> <li>By using lock and synchronization</li> <li>By using atomic variable</li> </ul> <p>Let&apos;s create a Java program and use an atomic variable to overcome the problem.</p> <h3>By using Atomic Variable</h3> <p> <strong>AtomicExample.java</strong> </p> <pre> class Counter extends Thread { // Counter Variable int count = 0; //the method starts the execution of a thread public void run() { int max = 1; //increments the counter variable up to specified max time for (int i = 0; i <max; i++) { count++; } public class counter static void main(string args[]) throws interruptedexception creating an instance of the c="new" counter(); four threads thread t1="new" thread(c, 'first'); t2="new" 'second'); t3="new" 'third'); t4="new" 'fourth'); by calling start() method, we have started t1.start(); t2.start(); t3.start(); t4.start(); main will wait for all until execution do not complete t1.join(); t2.join(); t3.join(); t4.join(); prints final value count variable system.out.println(c.count); < pre> <p> <strong>Output:</strong> </p> <pre> 4 </pre> <h2>Synchronized Vs. Atomic Vs. Volatile</h2> <table class="table"> <tr> <th>Synchronized</th> <th>Atomic</th> <th>Volatile</th> </tr> <tr> <td>It applies to methods only.</td> <td>It applies to variables only.</td> <td>It also applies to variables only.</td> </tr> <tr> <td>It ensures visibility along with atomicity.</td> <td>It also ensures visibility along with atomicity.</td> <td>It ensures visibility, not atomicity.</td> </tr> <tr> <td>We can&apos;t achieve the same.</td> <td>We can&apos;t achieve the same.</td> <td>It stores in RAM, so accessing volatile variables is fast. But it does not provide thread-safety and synchronization.</td> </tr> <tr> <td>It can be implemented as a synchronized block or a synchronized method.</td> <td>We can&apos;t achieve the same.</td> <td>We can&apos;t achieve the same.</td> </tr> <tr> <td>It can lock the same class object or a different class object.</td> <td>We can&apos;t achieve the same.</td> <td>We can&apos;t achieve the same.</td> </tr> </table> <hr></max;></pre></max;>

A fenti program a várt kimenetet adja, ha egyszálú környezetben fut. A többszálú környezet váratlan kimenethez vezethet. Ennek az az oka, hogy amikor két vagy több szál egyszerre próbálja frissíteni az értéket, előfordulhat, hogy nem frissül megfelelően.

mikor kezdődik a q2

Java ajánlatok kettő megoldások a probléma leküzdésére:

  • Zárolás és szinkronizálás segítségével
  • Atomi változó használatával

Hozzunk létre egy Java programot, és használjunk atomi változót a probléma megoldására.

Az Atomic Variable használatával

AtomicExample.java

 class Counter extends Thread { // Counter Variable int count = 0; //the method starts the execution of a thread public void run() { int max = 1; //increments the counter variable up to specified max time for (int i = 0; i <max; i++) { count++; } public class counter static void main(string args[]) throws interruptedexception creating an instance of the c="new" counter(); four threads thread t1="new" thread(c, \'first\'); t2="new" \'second\'); t3="new" \'third\'); t4="new" \'fourth\'); by calling start() method, we have started t1.start(); t2.start(); t3.start(); t4.start(); main will wait for all until execution do not complete t1.join(); t2.join(); t3.join(); t4.join(); prints final value count variable system.out.println(c.count); < pre> <p> <strong>Output:</strong> </p> <pre> 4 </pre> <h2>Synchronized Vs. Atomic Vs. Volatile</h2> <table class="table"> <tr> <th>Synchronized</th> <th>Atomic</th> <th>Volatile</th> </tr> <tr> <td>It applies to methods only.</td> <td>It applies to variables only.</td> <td>It also applies to variables only.</td> </tr> <tr> <td>It ensures visibility along with atomicity.</td> <td>It also ensures visibility along with atomicity.</td> <td>It ensures visibility, not atomicity.</td> </tr> <tr> <td>We can&apos;t achieve the same.</td> <td>We can&apos;t achieve the same.</td> <td>It stores in RAM, so accessing volatile variables is fast. But it does not provide thread-safety and synchronization.</td> </tr> <tr> <td>It can be implemented as a synchronized block or a synchronized method.</td> <td>We can&apos;t achieve the same.</td> <td>We can&apos;t achieve the same.</td> </tr> <tr> <td>It can lock the same class object or a different class object.</td> <td>We can&apos;t achieve the same.</td> <td>We can&apos;t achieve the same.</td> </tr> </table> <hr></max;>

Szinkronizált vs. Atom vs. Illó

Szinkronizált Atom Illó
Csak a módszerekre vonatkozik. Csak a változókra vonatkozik. Ez is csak a változókra vonatkozik.
Biztosítja a láthatóságot az atomitás mellett. A láthatóságot és az atomitást is biztosítja. Láthatóságot biztosít, nem atomitást.
Ugyanezt nem tudjuk elérni. Ugyanezt nem tudjuk elérni. A RAM-ban tárolja, így az illékony változókhoz való hozzáférés gyors. De nem nyújt szálbiztonságot és szinkronizálást.
Megvalósítható szinkronizált blokkként vagy szinkronizált metódusként. Ugyanezt nem érhetjük el. Ugyanezt nem tudjuk elérni.
Zárolhatja ugyanazt az osztályobjektumot vagy egy másik osztályobjektumot. Ugyanezt nem tudjuk elérni. Ugyanezt nem érhetjük el.