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
- Da preprečite motnje niti.
- Da preprečite težave z doslednostjo.
Vrste sinhronizacije
Obstajata dve vrsti sinhronizacije
- Sinhronizacija procesa
- Sinhronizacija niti
Tukaj bomo razpravljali samo o sinhronizaciji niti.
Sinhronizacija niti
Obstajata dve vrsti medsebojno izključujoče sinhronizacije niti in komunikacije med nitmi.
- Medsebojna izključitev
- Sinhronizirana metoda.
- Sinhroniziran blok.
- Statična sinhronizacija.
- 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:
- Z uporabo sinhronizirane metode
- Z uporabo sinhroniziranega bloka
- 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++){>
=5;i++){>=5;i++){>=5;i++){>