Синхронизацията в 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++){>