logo

Synchronizace v Javě

Synchronizace v Javě je schopnost řídit přístup více vláken k libovolnému sdílenému prostředku.

Synchronizace Java je lepší možností, kde chceme povolit přístup ke sdílenému prostředku pouze jednomu vláknu.

Proč používat synchronizaci?

Synchronizace se používá především k

  1. Aby se zabránilo rušení závitu.
  2. Aby se předešlo problémům s konzistencí.

Typy synchronizace

Existují dva typy synchronizace

  1. Synchronizace procesu
  2. Synchronizace vláken

Zde budeme diskutovat pouze o synchronizaci vláken.

Synchronizace vláken

Existují dva typy synchronizace vláken vzájemně se vylučující a komunikace mezi vlákny.

  1. Vzájemná exkluzivita
    1. Synchronizovaná metoda.
    2. Synchronizovaný blok.
    3. Statická synchronizace.
  2. Spolupráce (mezivláknová komunikace v jazyce Java)

Vzájemná exkluzivita

Mutual Exclusive pomáhá zabránit tomu, aby se vlákna vzájemně rušila při sdílení dat. Toho lze dosáhnout pomocí následujících tří způsobů:

  1. Pomocí synchronizované metody
  2. Pomocí synchronizovaného bloku
  3. Pomocí statické synchronizace

Koncept zámku v Javě

Synchronizace je postavena na vnitřní entitě známé jako zámek nebo monitor. Ke každému objektu je přiřazen zámek. Podle konvence musí vlákno, které potřebuje konzistentní přístup k polím objektu, získat zámek objektu, než k nim přistoupí, a poté zámek uvolnit, když je s nimi hotovo.

Od Java 5 obsahuje balíček java.util.concurrent.locks několik implementací zámků.

Pochopení problému bez synchronizace

V tomto příkladu neexistuje žádná synchronizace, takže výstup je nekonzistentní. Podívejme se na příklad:

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 synchronizovaná metoda

Pokud deklarujete jakoukoli metodu jako synchronizovanou, je známá jako synchronizovaná metoda.

Synchronizovaná metoda se používá k uzamčení objektu pro jakýkoli sdílený prostředek.

Když vlákno vyvolá synchronizovanou metodu, automaticky získá zámek pro daný objekt a uvolní jej, když vlákno dokončí svůj úkol.

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

Příklad synchronizované metody pomocí anonymní třídy

V tomto programu jsme vytvořili dvě vlákna pomocí anonymní třídy, takže je potřeba méně kódování.

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