logo

Sinhronizacija v Javi

Sinhronizacija v Javi je zmožnost nadzora dostopa več niti do katerega koli vira v skupni rabi.

Sinhronizacija Java je boljša možnost, kjer želimo omogočiti samo eni niti dostop do skupnega vira.

Zakaj uporabljati sinhronizacijo?

Sinhronizacija se uporablja predvsem za

  1. Da preprečite motnje niti.
  2. Da preprečite težave z doslednostjo.

Vrste sinhronizacije

Obstajata dve vrsti sinhronizacije

  1. Sinhronizacija procesa
  2. Sinhronizacija niti

Tukaj bomo razpravljali samo o sinhronizaciji niti.

Sinhronizacija niti

Obstajata dve vrsti medsebojno izključujoče sinhronizacije niti in komunikacije med nitmi.

  1. Medsebojna izključitev
    1. Sinhronizirana metoda.
    2. Sinhroniziran blok.
    3. Statična sinhronizacija.
  2. Sodelovanje (komunikacija med nitmi v Javi)

Medsebojna izključitev

Mutual Exclusive pomaga preprečiti, da bi se niti med souporabo podatkov med seboj motile. To lahko dosežete na naslednje tri načine:

  1. Z uporabo sinhronizirane metode
  2. Z uporabo sinhroniziranega bloka
  3. Z uporabo statične sinhronizacije

Koncept ključavnice v Javi

Sinhronizacija je zgrajena okoli notranje entitete, znane kot ključavnica ali monitor. Z vsakim predmetom je povezana ključavnica. Po dogovoru mora nit, ki potrebuje dosleden dostop do polj objekta, pridobiti zaklepanje objekta, preden dostopa do njih, in nato sprostiti zaklepanje, ko je z njimi končano.

Od Jave 5 paket java.util.concurrent.locks vsebuje več implementacij zaklepanja.

Razumevanje težave brez sinhronizacije

V tem primeru ni sinhronizacije, zato je izhod nedosleden. Poglejmo primer:

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

Sinhronizirana metoda Java

Če katero koli metodo deklarirate kot sinhronizirano, je znana kot sinhronizirana metoda.

Sinhronizirana metoda se uporablja za zaklepanje predmeta za kateri koli vir v skupni rabi.

Ko nit prikliče sinhronizirano metodo, samodejno pridobi zaklepanje za ta objekt in ga sprosti, ko nit dokonča svojo nalogo.

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

Primer sinhronizirane metode z uporabo anonimnega razreda

V tem programu smo ustvarili dve niti z uporabo anonimnega razreda, zato je potrebno manj kodiranja.

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