Синхронизация в Java: Какво, как и защо?



Тази статия за синхронизиране в Java ще ви помогне да научите как да синхронизирате многонишковите програми.

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

Ще обсъждам темите в този ред:





Да започваме!

Защо да използвам Синхронизация в Java?



Ако започнете с поне две нишки в дадена програма, може да има шанс, когато множество нишки се опитват да стигнат до един и същ ресурс. Дори може да създаде неочакван резултат поради проблеми с едновременността.

Синтаксис :

синхронизиран (objectidentifier) ​​{// Достъп до споделени променливи и други споделени ресурси}

Например, опит за писане в еквивалентен файл. Това може да повреди данните, тъй като една от нишките може да замени данните или когато нишка отварясъщия файл по едно и също време, друга нишка може да затваря същия файл.Има нужда от синхронизиране на действието на множество нишки. Това може да бъде приложено с помощта на концепция, наречена М онтори .



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

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

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

Налице са основно два вида синхронизация. Те са:

  1. Синхронизиране на процеса: Едновременното изпълнение на множество нишки или процеси, за да се достигне състояние, което да се ангажира с определена последователност от действия.
  2. Синхронизация на нишки: Понякога, когато повече от една нишкасе опитва да получи достъп до споделен ресурс, трябва да се уверите, че ресурсът ще се използва само от една нишка ввреме.

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

Заключва в Java

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

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

Ето как изглежда една ключалка:

публичен клас Lock {private boolean isLocked = false публично синхронизирано заключване на void () хвърля InterruptException {while (isLocked) {wait ()} isLocked = true} публично синхронизирано отключване на void () {isLocked = false notify ()}}

Методът lock () заключва екземпляра Lock, така че всички нишки, извикващи lock (), се блокират, докато не се изпълни unlock ().

Многопоточност без синхронизация

Ето един прост пример, който отпечатва стойността на брояча в последователност и всеки път, когато го стартираме, той дава различен резултат въз основа на наличността на процесора за нишка. Виж това!

клас Multithread {public void printCount () {try {for (int i = 5 i<0 i--) { System.out.println('Counter --- ' + i ) } } catch (Exception e) { System.out.println('Thread interrupted.') } } } class Thread extends Multithread { private Thread t private String threadName Multithread MT Thread( String name, Multithread mt) { threadName = name MT= mt } public void run() { MT.printCount() System.out.println('Thread ' + threadName + ' exiting.') } public void start () { System.out.println('Starting ' + threadName ) if (t == null) { t = new Thread (this, threadName) t.start () } } } public class TestThread { public static void main(String args[]) { Multithread MT = new Multithread() Thread t = new Thread( 'Thread - 1 ', MT) Thread t1 = new Thread( 'Thread - 2 ', MT) t.start() t1.start() // wait for threads to end try { t.join() t1.join() } catch ( Exception e) { System.out.println('Interrupted') } } }

Резултатите от горната програма в това:

Изход - Синхронизация в Java- Edureka

Многопоточност със синхронизация

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

клас Multithread {public void printCount () {try {for (int i = 5 i> 0 i--) {System.out.println ('Counter ---' + i)}} catch (Изключение e) {Система. out.println ('Thread interrupted.')}}} class Thread extends Multithread {private Thread t private String threadName Multithread MT Thread (String name, Multithread mt) {threadName = name MT = mt} public void run () {synchronized ( MT) {MT.printCount ()} System.out.println ('Thread' + threadName + 'exiting.')} Public void start () {System.out.println ('Starting' + threadName) if (t == null) {t = new Thread (this, threadName) t.start ()}}} публичен клас TestThread {public static void main (String args []) {Multithread MT = new Multithread () Thread T = new Thread ('Thread - 1 ', MT) Тема T1 = нова нишка (' Thread - 2 ', MT) T.start () T1.start () // изчакайте нишките да приключат, опитайте {T.join () T1.join ()} catch (Изключение e) {System.out.println ('Прекъснато')}}}

Резултатът е изобразен по-долу:

Синхронизирана ключова дума

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

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

Нека обсъдим кодовия блок.

Синхронизирана ключова дума: кодов блок

Синтаксис

Общият синтаксис за писане на синхронизиран блок е:

синхронизиран (lockObject) {// синхронизирани изявления}

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

урок за услуги за интеграция на SQL сървър

Забележка :

  • Ако нишката е поставена в режим на заспиване (използвайки сън () метод) тогава не освобождава ключалката. През това време на заспиване нито една нишка няма да изпълнява операторите на синхронизиран блок.
  • Java синхронизацията ще хвърли NullPointerException ако заключен обект, използван в „ синхронизирано (заключване) ‘Е нула.

Сега, нека обсъдим метода.

Синхронизирана ключова дума: Метод

Синтаксис

Общият синтаксис за писане на a синхронизиран метод е:

синхронизиран метод (параметри) {// синхронизиран код}

Тук lockObject е просто препратка към обект, чието заключване е свързано с монитора, който представлява синхронизираните изрази.

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

  • Обект „.class“ - ако даденият метод е статични .
  • „Този“ обект - ако методът е нестатични . ‘Това’ е препратката към текущия обект, в който се извиква синхронизираният метод.

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

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

Разлика между синхронизирана ключова дума и синхронизиран блок

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

Това ни води до края на тази статия, където обсъдихме как точно работи синхронизирането в Java. Надявам се, че сте наясно с всичко споделено с вас в този урок.

Вижте от Edureka, доверена компания за онлайн обучение с мрежа от над 250 000 доволни учащи, разпространени по целия свят. Ние сме тук, за да ви помогнем във всяка стъпка по вашето пътуване, за да станете освен тези въпроси за интервю за Java, измислим учебна програма, предназначена за студенти и професионалисти, които искат да бъдат разработчик на Java.

Имате въпрос към нас? Моля, споменете го в раздела за коментари на тази „Синхронизация в Java ' статия и ние ще се свържем с вас възможно най-скоро.