Synchronizácia v prostredí Java: Čo, Ako a prečo?



Tento článok o synchronizácii v prostredí Java vám pomôže pri učení sa o synchronizácii viacvláknových programov.

Programy s viacerými vláknami môžu pravidelne prichádzať k okolnostiam, keď sú viaceré pokúsiť sa dostať k rovnakému zdroju, ktorý prináša podvodné a prekvapivé výsledky. To sa dá vyriešiť použitím synchronizácie v Jave. K prostriedku sa v danom čase môže dostať iba jedno konkrétne vlákno. Tento článok vám pomôže oboznámiť sa so stratégiou synchronizácie.

Budem diskutovať o témach v tomto poradí:





Začnime!

Prečo používať synchronizáciu v Jave?



Ak začnete s najmenej dvoma vláknami v programe, môže sa vyskytnúť šanca, že sa viac vlákien pokúsi dostať k rovnakému prostriedku. Môže dokonca vytvoriť neočakávaný výsledok z dôvodu problémov so súbežnosťou.

Syntax :

synchronized (objectidentifier) ​​{// Prístup k zdieľaným premenným a iným zdieľaným zdrojom}

Napríklad, pokus o zápis do ekvivalentného súboru. Môže to poškodiť údaje, pretože jedno z vlákien môže prepísať údaje alebo keď vlákno otvárarovnaký súbor v rovnakom čase, iné vlákno môže zatvárať ten istý súbor.Je potrebné synchronizovať činnosť viacerých vlákien. To je možné implementovať pomocou konceptu tzv M návštevníci .



  • Každý je spojené s monitorom, ktorý môže vlákno zamknúť alebo odomknúť.
  • Zámok na monitore môže držať iba jedno vlákno súčasne.
  • Java programovací jazyk poskytuje veľmi užitočný spôsob vytvárania vlákien a synchronizácie ich úloh pomocou súboru Synchronizované blokov.
  • Udržuje tiež zdieľané zdroje v tomto konkrétnom bloku.

Synchronizované bloky v Jave sú označené symbolom Synchronizované kľúčové slovo. Tento blok v Jave je synchronizovaný s niektorým objektom.Všetky bloky, ktoré sú synchronizované na rovnakom objekte, môžu mať v sebe spustených iba jedno vlákno súčasne. Všetky ostatné vlákna, ktoré sa pokúšajú vstúpiť do synchronizovaného bloku, sú blokované, kým vlákno vo vnútri synchronizovaného bloku neopustí blok.

Typy synchronizácie

V zásade sú k dispozícii dva typy synchronizácie. Oni sú:

  1. Synchronizácia procesov: Simultánne vykonávanie viacerých vlákien alebo procesov na dosiahnutie stavu, v ktorom sa zaviažu k určitej postupnosti akcií.
  2. Synchronizácia vlákna: V časoch, keď existuje viac ako jedno vláknosa pokúša získať prístup k zdieľanému prostriedku, musíte sa ubezpečiť, že zdroj bude používať iba jedno vlákno v doméneDoba.

Nerozoberajme sa podrobne týchto typov a skúsme pochopiť, v čom sú zámky .

Zámky v Jave

Ako som už spomenul, synchronizácia je postavená na internej entite známej ako zámok alebo monitor . Ku každému objektu je priradený zámok. Takže vlákno, ktoré vyžaduje konzistentný prístup k poliam objektu, musí pred prístupom k nim získať zámok objektu a po dokončení práce zámok uvoľniť.

Z Javy 5 obsahuje balík java.util.concurrent.locks veľa implementácií zámku.

Takto vyzerá zámok:

public class Lock {private boolean isLocked = false public synchronized void lock () throws InterruptedException {while (isLocked) {wait ()} isLocked = true} public synchronized void unlock () {isLocked = false notify ()}}

Metóda lock () uzamkne inštanciu Lock tak, že všetky vlákna volajúce lock () sú blokované, kým sa nespustí unlock ().

Multi-threading bez synchronizácie

Tu je jednoduchý príklad, ktorý vytlačí hodnotu počítadla v poradí a zakaždým, keď ju spustíme, vytvorí iný výsledok na základe dostupnosti CPU pre vlákno. Pozri na toto!

trieda 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') } } }

Výsledkom vyššie uvedeného programu je:

Výstup- Synchronizácia v Jave- Edureka

Multi-threading so synchronizáciou

Toto je rovnaký príklad ako vyššie, ale vytlačí hodnotu počítadla v poradí. Zakaždým, keď ho spustíme, prinesie rovnaký výsledok.

trieda Multithread {public void printCount () {try {for (int i = 5 i> 0 i--) {System.out.println ('Counter ---' + i)}} catch (Výnimka 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 () {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 ()}}} public class TestThread {public static void main (String args []) {Multithread MT = new Multithread () Thread T = new Thread ('Thread - 1 ', MT) Vlákno T1 = nové vlákno (' Vlákno - 2 ', MT) T.start () T1.start () // čakať na ukončenie vlákien vyskúšať {T.join () T1.join ()} catch (Výnimka e) {System.out.println ('Prerušený')}}}

Výstup je uvedený nižšie:

Synchronizované kľúčové slovo

synchronizované kľúčové slovo označí blok alebo metódu kritickou časťou. Kritická časť je miesto, kde sa súčasne vykonáva iba jedno vlákno a vlákno drží zámok pre synchronizovanú časť. Toto synchronizované kľúčové slovo pomáha pri písaní súbežne časti akejkoľvek aplikácie. Chráni tiež zdieľané zdroje v rámci bloku.

Synchronizované kľúčové slovo je možné použiť s:

Poďme diskutovať o bloku kódu.

Synchronizované kľúčové slovo: blok kódu

Syntax

Všeobecná syntax pre zápis synchronizovaného bloku je:

synchronized (lockObject) {// synchronized commands}

Ak chce vlákno vykonávať synchronizované príkazy vo vnútri bloku, musí získať zámok na monitore lockObject. Iba jeden vlákno môže získať monitor zámku objektu naraz. Všetky ostatné vlákna teda musia počkať, kým vlákno, ktoré práve vykonáva, nezíska zámok a dokončí svoje vykonávanie.
Týmto spôsobom synchronizované kľúčové slovo zaručuje, že synchronizované blokové príkazy bude vykonávať naraz iba jedno vlákno, a zabráni tak viacerým vláknam v poškodení zdieľaných údajov, ktoré sa nachádzajú v bloku.

Poznámka :

  • Ak je vlákno uvedené do režimu spánku (pomocou spánok () metóda) potom neuvoľní zámok. Počas tejto doby spánku nebude žiadne vlákno vykonávať synchronizované blokové príkazy.
  • Synchronizácia Java bude vrhať NullPointerException ak je uzamknutý objekt použitý v „ synchronizované (zámok) ‘Je neplatné.

Teraz poďme diskutovať o metóde.

Synchronizované kľúčové slovo: Metóda

Syntax

Všeobecná syntax pre zápis a synchronizovaná metóda je:

synchronizovaná metóda (parametre) {// synchronizovaný kód}

Tu lockObject je len odkaz na objekt, ktorého zámok je spojený s monitorom, ktorý predstavuje synchronizované príkazy.

Podobne ako v prípade synchronizovaného bloku musí vlákno získať zámok na pripojenom objekte monitora synchronizovanou metódou. V prípade synchronizovanej metódy je objekt zámku:

ako zastaviť program v jave
  • Objekt „.class“ - ak je daná metóda statický .
  • „Tento“ objekt - ak je metóda nestatické . „Toto“ je odkaz na aktuálny objekt, v ktorom je vyvolaná synchronizovaná metóda.

Synchronizované kľúčové slovo Java je opätovný účastník v prírode. To znamená, že ak synchronizovaná metóda volá inú synchronizovanú metódu, ktorá vyžaduje rovnaký zámok, potom súčasné vlákno, ktoré drží zámok, môže vstúpiť do tejto metódy bez získania zámku.

Prejdime k záverečnej téme tohto článku a poukážeme na hlavné rozdiely medzi synchronizovaným kľúčovým slovom a synchronizačným blokom.

Rozdiel medzi synchronizovaným kľúčovým slovom a synchronizovaným blokom

  • Keď použijete synchronizované kľúčové slovo s a metóda , získa zámok v objekte pre celú metódu. To znamená, že žiadne iné vlákno nemôže používať žiadnu synchronizovanú metódu, kým súčasné vlákno, ktoré je vyvolané, nedokončí svoje vykonávanie.
  • Synchronizované blokovať získa zámok v objekte iba medzi zátvorkami po zadaní synchronizovaného kľúčového slova. To znamená, že žiadne iné vlákno nemôže získať zámok na už uzamknutom objekte, kým blok nevystúpi. Ale ostatné vlákna budú mať prístup k zvyšku kódu, ktorý je v metóde k dispozícii.

Týmto sa dostávame na koniec tohto článku, kde sme diskutovali o tom, ako presne synchronizácia v Jave funguje. Dúfam, že máte prehľad o všetkom, čo bolo s vami zdieľané v tomto tutoriále.

Pozrite sa na autor: Edureka, dôveryhodná online vzdelávacia spoločnosť so sieťou viac ako 250 000 spokojných študentov rozmiestnených po celom svete. Sme tu, aby sme vám pomohli na každom kroku na vašej ceste. Okrem otázok týkajúcich sa tohto rozhovoru pre jazyk java vymýšľame aj študijný program určený pre študentov a profesionálov, ktorí sa chcú stať vývojármi v prostredí Java.

Máte na nás otázku? Uveďte to v sekcii komentárov v tejto časti „Synchronizácia v prostredí Javačlánok a my sa vám ozveme čo najskôr.