logo

Sinchronizavimas Java

„Java“ sinchronizavimas yra galimybė valdyti kelių gijų prieigą prie bet kurio bendrinamo šaltinio.

„Java“ sinchronizavimas yra geresnė parinktis, kai norime leisti tik vienai gijai pasiekti bendrinamą šaltinį.

Kodėl naudoti sinchronizavimą?

Sinchronizacija dažniausiai naudojama

  1. Kad būtų išvengta siūlų trukdžių.
  2. Siekiant išvengti nuoseklumo problemų.

Sinchronizacijos tipai

Yra du sinchronizavimo tipai

  1. Proceso sinchronizavimas
  2. Gijos sinchronizavimas

Čia aptarsime tik gijų sinchronizavimą.

Gijos sinchronizavimas

Yra dviejų tipų gijų sinchronizavimo abipusis išskirtinis ir gijų tarpusavio ryšys.

  1. Abipusis išskirtinis
    1. Sinchronizuotas metodas.
    2. Sinchronizuotas blokas.
    3. Statinė sinchronizacija.
  2. Bendradarbiavimas (tarp gijų komunikacija Java)

Abipusis išskirtinis

„Mutual Exclusive“ padeda apsaugoti, kad gijos netrukdytų viena kitai dalijantis duomenimis. Tai galima pasiekti naudojant šiuos tris būdus:

  1. Naudojant sinchronizuotą metodą
  2. Naudojant sinchronizuotą bloką
  3. Naudojant statinį sinchronizavimą

„Java“ užrakto koncepcija

Sinchronizavimas yra sukurtas aplink vidinį objektą, žinomą kaip užraktas arba monitorius. Kiekvienas objektas turi su juo susietą užraktą. Pagal susitarimą, gija, kuriai reikia nuoseklios prieigos prie objekto laukų, prieš juos pasiekiant turi įgyti objekto užraktą, o tada atleisti užraktą, kai tai bus atlikta su jais.

Iš „Java 5“ pakete java.util.concurrent.locks yra keli užrakto diegimai.

Problemos supratimas be sinchronizavimo

Šiame pavyzdyje nėra sinchronizavimo, todėl išvestis yra nenuosekli. Pažiūrėkime pavyzdį:

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“ sinchronizuotas metodas

Jei kurį nors metodą paskelbiate sinchronizuotu, jis vadinamas sinchronizuotu metodu.

Sinchronizuotas metodas naudojamas užrakinti objektą bet kokiam bendram ištekliui.

Kai gija iškviečia sinchronizuotą metodą, ji automatiškai įgyja to objekto užraktą ir atleidžia jį, kai gija atlieka savo užduotį.

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++){>

Sinchronizuoto metodo pavyzdys naudojant anoniminę klasę

Šioje programoje mes sukūrėme dvi gijas naudodami anoniminę klasę, todėl reikia mažiau koduoti.

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++){>