Синхронізація в Java — це можливість контролювати доступ кількох потоків до будь-якого спільного ресурсу.
Синхронізація Java є кращим варіантом, коли ми хочемо дозволити лише одному потоку отримати доступ до спільного ресурсу.
Навіщо використовувати синхронізацію?
Синхронізація в основному використовується для
- Щоб запобігти втручанню ниток.
- Щоб запобігти проблемі узгодженості.
Види синхронізації
Існує два типи синхронізації
- Синхронізація процесів
- Синхронізація потоків
Тут ми обговоримо лише синхронізацію потоків.
Синхронізація потоків
Існує два типи взаємовиключної синхронізації потоків і зв’язку між потоками.
- Взаємне виключення
- Синхронізований метод.
- Синхронізований блок.
- Статична синхронізація.
- Співпраця (міжпотокове спілкування в java)
Взаємне виключення
Mutual Exclusive допомагає уникнути втручання потоків один в одного під час обміну даними. Цього можна досягти трьома способами:
- За допомогою синхронізованого методу
- За допомогою синхронізованого блоку
- За допомогою статичної синхронізації
Концепція блокування в 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++){>
=5;i++){>=5;i++){>=5;i++){>