Sinkronizacija u Javi je mogućnost kontrole pristupa više niti bilo kojem zajedničkom resursu.
Java sinkronizacija je bolja opcija kada samo jednoj niti želimo dopustiti pristup dijeljenom resursu.
Zašto koristiti sinkronizaciju?
Sinkronizacija se uglavnom koristi za
- Da biste spriječili smetnje niti.
- Kako biste spriječili problem dosljednosti.
Vrste sinkronizacije
Postoje dvije vrste sinkronizacije
- Sinkronizacija procesa
- Sinkronizacija niti
Ovdje ćemo raspravljati samo o sinkronizaciji niti.
Sinkronizacija niti
Postoje dvije vrste međusobno isključive sinkronizacije niti i komunikacije između niti.
- Uzajamno isključivanje
- Sinkronizirana metoda.
- Sinkronizirani blok.
- Statička sinkronizacija.
- Suradnja (komunikacija među nitima u Javi)
Uzajamno isključivanje
Mutual Exclusive pomaže u sprječavanju međusobnog miješanja niti tijekom dijeljenja podataka. To se može postići na sljedeća tri načina:
- Korištenjem sinkronizirane metode
- Korištenjem sinkroniziranog bloka
- Korištenjem statičke sinkronizacije
Koncept zaključavanja u Javi
Sinkronizacija je izgrađena oko unutarnjeg entiteta poznatog kao brava ili monitor. Svaki objekt ima povezanu bravu. Prema konvenciji, nit koja treba konzistentan pristup poljima objekta mora steći zaključavanje objekta prije pristupa njima, a zatim otpustiti zaključavanje kada završi s njima.
Od Jave 5 paket java.util.concurrent.locks sadrži nekoliko implementacija zaključavanja.
Razumijevanje problema bez sinkronizacije
U ovom primjeru nema sinkronizacije, pa je izlaz nedosljedan. Pogledajmo primjer:
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 sinkronizirana metoda
Ako bilo koju metodu deklarirate kao sinkroniziranu, ona je poznata kao sinkronizirana metoda.
Sinkronizirana metoda koristi se za zaključavanje objekta za bilo koji zajednički resurs.
Kada nit pozove sinkroniziranu metodu, ona automatski preuzima zaključavanje za taj objekt i otpušta ga kada nit završi svoj zadatak.
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++){>
Primjer sinkronizirane metode korištenjem anonimne klase
U ovom smo programu stvorili dvije niti korištenjem anonimne klase, tako da je potrebno manje 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++){>
=5;i++){>=5;i++){>=5;i++){>