logo

Синхронизация в Java

Синхронизацията в Java е способността да се контролира достъпът на множество нишки до всеки споделен ресурс.

Синхронизирането на Java е по-добра опция, когато искаме да позволим само на една нишка да има достъп до споделения ресурс.

Защо да използвате синхронизация?

Синхронизацията се използва главно за

  1. За предотвратяване на смущения в резбата.
  2. За предотвратяване на проблем с последователността.

Видове синхронизация

Има два вида синхронизация

  1. Синхронизация на процеси
  2. Синхронизиране на нишки

Тук ще обсъдим само синхронизирането на нишки.

Синхронизиране на нишки

Има два типа синхронизиране на нишки, взаимно изключващи се и комуникация между нишки.

  1. Взаимно изключване
    1. Синхронизиран метод.
    2. Синхронизиран блок.
    3. Статична синхронизация.
  2. Сътрудничество (комуникация между нишки в java)

Взаимно изключване

Mutual Exclusive помага на нишките да не се намесват една в друга, докато споделят данни. Това може да се постигне, като се използват следните три начина:

  1. Чрез използване на синхронизиран метод
  2. Чрез използване на синхронизиран блок
  3. Чрез използване на статична синхронизация

Концепция за заключване в Java

Синхронизацията е изградена около вътрешна единица, известна като ключалка или монитор. Всеки обект има ключалка, свързана с него. По конвенция, нишка, която се нуждае от последователен достъп до полетата на обект, трябва да получи заключването на обекта, преди да получи достъп до тях, и след това да освободи заключването, когато приключи с тях.

От Java 5 пакетът java.util.concurrent.locks съдържа няколко реализации на заключване.

Разбиране на проблема без синхронизация

В този пример няма синхронизация, така че изходът е непоследователен. Да видим примера:

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

Ако декларирате който и да е метод като синхронизиран, той е известен като синхронизиран метод.

Синхронизираният метод се използва за заключване на обект за всеки споделен ресурс.

Когато нишката извиква синхронизиран метод, тя автоматично получава ключалката за този обект и я освобождава, когато нишката изпълни задачата си.

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

Пример за синхронизиран метод чрез използване на анонимен клас

В тази програма създадохме двете нишки с помощта на анонимния клас, така че е необходимо по-малко кодиране.

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