logo

Synchronizácia v jazyku Java

Synchronizácia v jazyku Java je schopnosť riadiť prístup viacerých vlákien k akémukoľvek zdieľanému zdroju.

Synchronizácia Java je lepšia možnosť, keď chceme povoliť prístup k zdieľanému zdroju iba jednému vláknu.

Prečo používať synchronizáciu?

Používa sa hlavne synchronizácia

  1. Aby sa zabránilo rušeniu závitu.
  2. Aby sa predišlo problémom s konzistenciou.

Typy synchronizácie

Existujú dva typy synchronizácie

  1. Synchronizácia procesov
  2. Synchronizácia vlákien

Tu budeme diskutovať iba o synchronizácii vlákien.

Synchronizácia vlákien

Existujú dva typy synchronizácie vlákien, vzájomne sa vylučujúce a medzi vláknami.

  1. Vzájomná exkluzívnosť
    1. Synchronizovaná metóda.
    2. Synchronizovaný blok.
    3. Statická synchronizácia.
  2. Spolupráca (medzivláknová komunikácia v jazyku Java)

Vzájomná exkluzívnosť

Vzájomné exkluzívne pomáha zabrániť tomu, aby sa vlákna navzájom rušili pri zdieľaní údajov. Dá sa to dosiahnuť pomocou nasledujúcich troch spôsobov:

  1. Pomocou synchronizovanej metódy
  2. Pomocou synchronizovaného bloku
  3. Pomocou statickej synchronizácie

Koncept zámku v Jave

Synchronizácia je postavená na internej entite známej ako zámok alebo monitor. Každý objekt má priradený zámok. Podľa konvencie vlákno, ktoré potrebuje konzistentný prístup k poliam objektu, musí získať zámok objektu predtým, ako k nim pristúpi, a potom uvoľniť zámok, keď s nimi skončí.

Od Java 5 balík java.util.concurrent.locks obsahuje niekoľko implementácií zámkov.

Pochopenie problému bez synchronizácie

V tomto príklade neexistuje žiadna synchronizácia, takže výstup je nekonzistentný. Pozrime sa na príklad:

TestSynchronization1.java

 class Table{ void printTable(int n){//method not synchronized for(int i=1;i<=5;i++){ system.out.println(n*i); try{ thread.sleep(400); }catch(exception e){system.out.println(e);} } class mythread1 extends thread{ table t; mythread1(table t){ this.t="t;" public void run(){ t.printtable(5); mythread2 mythread2(table t.printtable(100); testsynchronization1{ static main(string args[]){ obj="new" table(); only one object t1="new" mythread1(obj); t2="new" mythread2(obj); t1.start(); t2.start(); < pre> <p> <strong>Output:</strong> </p> <pre> 5 100 10 200 15 300 20 400 25 500 </pre> <h3>Java Synchronized Method</h3> <p>If you declare any method as synchronized, it is known as synchronized method.</p> <p>Synchronized method is used to lock an object for any shared resource.</p> <p>When a thread invokes a synchronized method, it automatically acquires the lock for that object and releases it when the thread completes its task.</p> <p> <strong>TestSynchronization2.java</strong> </p> <pre> //example of java synchronized method class Table{ synchronized void printTable(int n){//synchronized method for(int i=1;i<=5;i++){ system.out.println(n*i); try{ thread.sleep(400); }catch(exception e){system.out.println(e);} } class mythread1 extends thread{ table t; mythread1(table t){ this.t="t;" public void run(){ t.printtable(5); mythread2 mythread2(table t.printtable(100); testsynchronization2{ static main(string args[]){ obj="new" table(); only one object t1="new" mythread1(obj); t2="new" mythread2(obj); t1.start(); t2.start(); < pre> <p> <strong>Output:</strong> </p> <pre> 5 10 15 20 25 100 200 300 400 500 </pre> <h3>Example of synchronized method by using annonymous class</h3> <p>In this program, we have created the two threads by using the anonymous class, so less coding is required.</p> <p> <strong>TestSynchronization3.java</strong> </p> <pre> //Program of synchronized method by using annonymous class class Table{ synchronized void printTable(int n){//synchronized method for(int i=1;i<=5;i++){ system.out.println(n*i); try{ thread.sleep(400); }catch(exception e){system.out.println(e);} } public class testsynchronization3{ static void main(string args[]){ final table obj="new" table(); only one object thread t1="new" thread(){ run(){ obj.printtable(5); }; t2="new" obj.printtable(100); t1.start(); t2.start(); < pre> <p> <strong>Output:</strong> </p> <pre> 5 10 15 20 25 100 200 300 400 500 </pre> <hr></=5;i++){></pre></=5;i++){></pre></=5;i++){>

Java synchronizovaná metóda

Ak deklarujete akúkoľvek metódu ako synchronizovanú, je známa ako synchronizovaná metóda.

Synchronizovaná metóda sa používa na uzamknutie objektu pre akýkoľvek zdieľaný prostriedok.

Keď vlákno vyvolá synchronizovanú metódu, automaticky získa zámok pre daný objekt a uvoľní ho, keď vlákno dokončí svoju úlohu.

TestSynchronization2.java

 //example of java synchronized method class Table{ synchronized void printTable(int n){//synchronized method for(int i=1;i<=5;i++){ system.out.println(n*i); try{ thread.sleep(400); }catch(exception e){system.out.println(e);} } class mythread1 extends thread{ table t; mythread1(table t){ this.t="t;" public void run(){ t.printtable(5); mythread2 mythread2(table t.printtable(100); testsynchronization2{ static main(string args[]){ obj="new" table(); only one object t1="new" mythread1(obj); t2="new" mythread2(obj); t1.start(); t2.start(); < pre> <p> <strong>Output:</strong> </p> <pre> 5 10 15 20 25 100 200 300 400 500 </pre> <h3>Example of synchronized method by using annonymous class</h3> <p>In this program, we have created the two threads by using the anonymous class, so less coding is required.</p> <p> <strong>TestSynchronization3.java</strong> </p> <pre> //Program of synchronized method by using annonymous class class Table{ synchronized void printTable(int n){//synchronized method for(int i=1;i<=5;i++){ system.out.println(n*i); try{ thread.sleep(400); }catch(exception e){system.out.println(e);} } public class testsynchronization3{ static void main(string args[]){ final table obj="new" table(); only one object thread t1="new" thread(){ run(){ obj.printtable(5); }; t2="new" obj.printtable(100); t1.start(); t2.start(); < pre> <p> <strong>Output:</strong> </p> <pre> 5 10 15 20 25 100 200 300 400 500 </pre> <hr></=5;i++){></pre></=5;i++){>

Príklad synchronizovanej metódy pomocou anonymnej triedy

V tomto programe sme vytvorili dve vlákna pomocou anonymnej triedy, takže je potrebné menej kódovania.

TestSynchronization3.java

 //Program of synchronized method by using annonymous class class Table{ synchronized void printTable(int n){//synchronized method for(int i=1;i<=5;i++){ system.out.println(n*i); try{ thread.sleep(400); }catch(exception e){system.out.println(e);} } public class testsynchronization3{ static void main(string args[]){ final table obj="new" table(); only one object thread t1="new" thread(){ run(){ obj.printtable(5); }; t2="new" obj.printtable(100); t1.start(); t2.start(); < pre> <p> <strong>Output:</strong> </p> <pre> 5 10 15 20 25 100 200 300 400 500 </pre> <hr></=5;i++){>