Synkronisering i Java er muligheten til å kontrollere tilgangen til flere tråder til en hvilken som helst delt ressurs.
Java-synkronisering er et bedre alternativ der vi vil tillate bare én tråd å få tilgang til den delte ressursen.
Hvorfor bruke synkronisering?
Synkroniseringen brukes hovedsakelig til
- For å forhindre trådinterferens.
- For å forhindre konsistensproblem.
Typer synkronisering
Det finnes to typer synkronisering
- Prosesssynkronisering
- Trådsynkronisering
Her vil vi kun diskutere trådsynkronisering.
Trådsynkronisering
Det er to typer trådsynkronisering, gjensidig utelukkende og inter-trådkommunikasjon.
- Gjensidig eksklusiv
- Synkronisert metode.
- Synkronisert blokk.
- Statisk synkronisering.
- Samarbeid (intertrådkommunikasjon i java)
Gjensidig eksklusiv
Mutual Exclusive hjelper til med å forhindre at tråder forstyrrer hverandre mens de deler data. Det kan oppnås ved å bruke følgende tre måter:
- Ved å bruke synkronisert metode
- Ved å bruke Synchronized Block
- Ved å bruke statisk synkronisering
Konseptet med lås i Java
Synkronisering er bygget rundt en intern enhet kjent som låsen eller skjermen. Hvert objekt har en lås knyttet til seg. Ved konvensjon må en tråd som trenger konsistent tilgang til et objekts felt skaffe objektets lås før du får tilgang til dem, og deretter frigjøre låsen når den er ferdig med dem.
Fra Java 5 inneholder pakken java.util.concurrent.locks flere låsimplementeringer.
Forstå problemet uten synkronisering
I dette eksemplet er det ingen synkronisering, så utdata er inkonsekvent. La oss se eksempelet:
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-synkronisert metode
Hvis du erklærer en metode som synkronisert, er den kjent som synkronisert metode.
Synkronisert metode brukes til å låse et objekt for enhver delt ressurs.
Når en tråd påkaller en synkronisert metode, får den automatisk låsen for det objektet og frigjør den når tråden fullfører oppgaven.
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++){>
Eksempel på synkronisert metode ved bruk av anonym klasse
I dette programmet har vi laget de to trådene ved å bruke den anonyme klassen, så det kreves mindre koding.
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++){>