Synchronizace v Javě: Co, jak a proč?



Tento článek o Synchronizaci v Javě vám pomůže provést postup, jak se dozvědět více o synchronizaci vícevláknových programů.

Programy s více vlákny mohou pravidelně přicházet s okolností, kdy je více pokusit se dostat ke stejnému zdroji, který vytváří podvodné a překvapivé výsledky. To lze vyřešit pomocí synchronizace v Javě. Ke zdroji se v daném čase může dostat jen jedno konkrétní vlákno. Tento článek vám pomůže seznámit se se strategií synchronizace.

Budu diskutovat o tématech v tomto pořadí:





Začněme!

Proč používat synchronizaci v Javě?



Pokud začnete s alespoň dvěma vlákny uvnitř programu, může se stát, že se více vláken pokusí dostat ke stejnému prostředku. Může dokonce vytvořit neočekávaný výsledek kvůli problémům se souběžností.

Syntax :

synchronized (objectidentifier) ​​{// Přístup ke sdíleným proměnným a dalším sdíleným prostředkům}

Například, pokus o zápis do ekvivalentního souboru. To může poškodit data, protože jedno z vláken může přepsat data nebo když vlákno otevírástejný soubor ve stejnou dobu, jiné vlákno může zavírat stejný soubor.Je potřeba synchronizovat akci více vláken. To lze implementovat pomocí konceptu s názvem M návštěvníci .



  • Každý je spojeno s monitorem, který může vlákno zamknout nebo odemknout.
  • Pouze jeden podproces může současně držet zámek na monitoru.
  • Jáva programovací jazyk poskytuje velmi užitečný způsob vytváření vláken a synchronizace jejich úkolů pomocí Synchronizováno bloky.
  • Také udržuje sdílené prostředky v tomto konkrétním bloku.

Synchronizované bloky v Javě jsou označeny Synchronizováno klíčové slovo. Tento blok v Javě je synchronizován na nějakém objektu.Všechny bloky synchronizované na stejném objektu mohou mít v sobě spuštěno pouze jedno vlákno najednou. Všechna ostatní vlákna, která se pokoušejí vstoupit do synchronizovaného bloku, jsou blokována, dokud vlákno uvnitř synchronizovaného bloku neopustí blok.

Druhy synchronizace

V zásadě existují dva typy synchronizace. Oni jsou:

  1. Synchronizace procesu: Simultánní provádění více vláken nebo procesů k dosažení stavu, který se zaváže k určité posloupnosti akcí.
  2. Synchronizace vláken: V době, kdy více než jedno vláknose pokusí získat přístup ke sdílenému prostředku, musíte se ujistit, že prostředek bude používán pouze jedním vláknem vDoba.

Pojďme se nezabývat podrobnostmi těchto typů a pokusme se pochopit, v čem jsou zámky .

Zámky v Javě

Jak jsem již zmínil dříve, synchronizace je postavena na interní entitě známé jako zámek nebo monitor . Ke každému objektu je přidružen zámek. Takže vlákno, které potřebuje konzistentní přístup k polím objektu, musí před přístupem k nim získat zámek objektu a po dokončení práce zámek uvolnit.

Z prostředí Java 5 obsahuje balíček java.util.concurrent.locks mnoho implementací zámku.

Takto vypadá zámek:

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 ()}}

Metoda lock () uzamkne instanci Lock tak, že jsou blokována všechna vlákna volající lock (), dokud není spuštěna unlock ().

Vícevláknové zpracování bez synchronizace

Zde je jednoduchý příklad, který vytiskne hodnotu čítače v sekvenci a pokaždé, když ji spustíme, vytvoří jiný výsledek na základě dostupnosti CPU pro vlákno. Koukej na tohle!

třída 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ýsledkem výše uvedeného programu je:

Výstup - synchronizace v Javě - Edureka

Multi-threading se synchronizací

Toto je stejný příklad jako výše, ale vytiskne hodnotu čítače v pořadí. Pokaždé, když jej spustíme, získá stejný výsledek.

třída 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 () {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 () // čekat na ukončení vláken zkusit {T.join () T1.join ()} catch (Výjimka e) {System.out.println ('Přerušeno')}}}

Výstup je znázorněn níže:

Synchronizované klíčové slovo

synchronizované klíčové slovo označí blok nebo metodu jako kritickou část. Kritická část je místo, kde se současně spouští pouze jedno vlákno a vlákno drží zámek pro synchronizovanou část. Tento synchronizované klíčové slovo pomáhá při psaní souběžně části jakékoli aplikace. Chrání také sdílené zdroje v rámci bloku.

Synchronizované klíčové slovo lze použít s:

Pojďme diskutovat o bloku kódu.

Synchronizované klíčové slovo: Blok kódu

Syntax

Obecná syntaxe pro zápis synchronizovaného bloku je:

synchronized (lockObject) {// synchronized commands}

Když vlákno chce provádět synchronizované příkazy uvnitř bloku, musí získat zámek na monitoru lockObject. Pouze jeden podproces může získat monitor zámku objektu najednou. Všechna ostatní vlákna tedy musí počkat, dokud aktuálně provádějící vlákno nezíská zámek a nedokončí jeho provádění.
Tímto způsobem synchronizované klíčové slovo zaručuje, že synchronizované blokové příkazy bude spouštět najednou pouze jedno vlákno, a tak zabrání tomu, aby více vláken poškodilo sdílená data, která jsou uvnitř bloku.

Poznámka :

  • Pokud je vlákno uvedeno do režimu spánku (pomocí spát() metoda), pak zámek neuvolní. Během této doby spánku nebude žádné vlákno vykonávat příkazy synchronizovaného bloku.
  • Synchronizace Java vyvolá NullPointerException pokud je objekt zámku použit v „ synchronizované (zámek) „Je null.

Nyní pojďme diskutovat o metodě.

Synchronizované klíčové slovo: Metoda

Syntax

Obecná syntaxe pro zápis a synchronizovaná metoda je:

synchronizovaná metoda (parametry) {// synchronizovaný kód}

Tady lockObject je pouze odkaz na objekt, jehož zámek je spojen s monitorem, který představuje synchronizované příkazy.

Podobně jako synchronizovaný blok musí vlákno získat zámek na připojeném objektu monitoru pomocí synchronizované metody. V případě synchronizované metody je objekt zámku:

jaký je nejlepší java ide
  • Objekt „.class“ - pokud je daná metoda statický .
  • „Tento“ objekt - pokud je metoda nestatické . „This“ je odkaz na aktuální objekt, ve kterém je vyvolána synchronizovaná metoda.

Synchronizované klíčové slovo Java je reentrant v přírodě. To znamená, že pokud synchronizovaná metoda volá jinou synchronizovanou metodu, která vyžaduje stejný zámek, pak aktuální vlákno, které drží zámek, může vstoupit do této metody bez získání zámku.

Pojďme k závěrečnému tématu tohoto článku a upozorněme na hlavní rozdíly mezi synchronizovaným klíčovým slovem a synchronizačním blokem.

Rozdíl mezi synchronizovaným klíčovým slovem a synchronizovaným blokem

  • Když používáte synchronizované klíčové slovo s a metoda , získá zámek v objektu pro celou metodu. To znamená, že žádné jiné vlákno nemůže používat žádnou synchronizovanou metodu, dokud aktuální vlákno, které je vyvoláno, nedokončí své provádění.
  • Synchronizováno blok po zadání synchronizovaného klíčového slova získá zámek v objektu pouze mezi závorkami. To znamená, že žádné jiné vlákno nemůže získat zámek na již uzamčeném objektu, dokud se blok neopustí. Ale ostatní vlákna budou mít přístup ke zbytku kódu, který je v metodě přítomen.

Tím se dostáváme na konec tohoto článku, kde jsme diskutovali o tom, jak přesně synchronizace v Javě funguje. Doufám, že máte jasno se vším, co bylo s vámi v tomto tutoriálu sdíleno.

Podívejte se na Edureka, důvěryhodná online vzdělávací společnost se sítí více než 250 000 spokojených studentů rozložených po celém světě. Jsme tu, abychom vám pomohli s každým krokem na vaší cestě, abychom se kromě otázek týkajících se tohoto rozhovoru pro javu stali i učebním plánem, který je určen pro studenty a profesionály, kteří chtějí být vývojářem Java.

Máte na nás dotaz? Uveďte to prosím v sekci komentářů v této části „Synchronizace v Javě ' článku a my se vám ozveme co nejdříve.