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