Синхронизација у Јави је могућност контроле приступа више нити било ком дељеном ресурсу.
Јава синхронизација је боља опција где желимо да дозволимо само једној нити да приступи дељеном ресурсу.
Зашто користити синхронизацију?
Синхронизација се углавном користи за
- Да бисте спречили ометање нити.
- Да бисте спречили проблем конзистентности.
Врсте синхронизације
Постоје две врсте синхронизације
- Синхронизација процеса
- Тхреад Синцхронизатион
Овде ћемо разговарати само о синхронизацији нити.
Тхреад Синцхронизатион
Постоје два типа међусобно искључиве синхронизације нити комуникације међу нитима.
- Мутуал Екцлусиве
- Синхронизована метода.
- Синхронизовани блок.
- Статичка синхронизација.
- Сарадња (комуникација између нити у Јави)
Мутуал Екцлусиве
Узајамно искључење помаже да се нити не мешају једна у другу док деле податке. То се може постићи коришћењем следећа три начина:
- Коришћењем синхронизованог метода
- Коришћењем синхронизованог блока
- Коришћењем статичке синхронизације
Концепт закључавања у Јави
Синхронизација је изграђена око унутрашњег ентитета познатог као закључавање или монитор. Сваки објекат има повезану браву. По конвенцији, нит којој је потребан доследан приступ пољима објекта мора да стекне закључавање објекта пре него што им приступи, а затим да отпусти закључавање када заврши са њима.
Из Јаве 5 пакет јава.утил.цонцуррент.лоцкс садржи неколико имплементација закључавања.
Разумевање проблема без синхронизације
У овом примеру нема синхронизације, па је излаз недоследан. Погледајмо пример:
ТестСинцхронизатион1.јава
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++){>
Јава синхронизовани метод
Ако декларишете било коју методу као синхронизовану, она је позната као синхронизована метода.
Синхронизована метода се користи за закључавање објекта за било који дељени ресурс.
Када нит позове синхронизовани метод, она аутоматски преузима закључавање за тај објекат и ослобађа га када нит заврши свој задатак.
ТестСинцхронизатион2.јава
//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++){>
Пример синхронизоване методе коришћењем анонимне класе
У овом програму смо креирали две нити користећи анонимну класу, тако да је потребно мање кодирања.
ТестСинцхронизатион3.јава
//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++){>