Přejít na hlavní obsah

Princip synchronized v jazyce Java

  • Stanislava Dostálová
  • Průvodci

Jedním z klíčových mechanismů pro zabezpečení vícevláknových aplikací v programovacím jazyce Java je klíčové slovo synchronized. Umožňuje synchronizovat přístup ke sdíleným zdrojům tak, že blokuje jejich spuštění současně více vlákny.

Princip práce synchronized každý objekt v Javě má interní monitor, který se používá k synchronizaci. Když se Stream pokusí spustit blok kódu označený jako synchronized, musí nejprve zachytit monitor objektu, ke kterému jednotka kódu patří.

Pokud je monitor objektu uzamčen jiným proudem, tok, který se pokouší spustit synchronizovanou jednotku, bude čekat, až se monitor uvolní. Jakmile je monitor získán, stream provede kód v synchronizované jednotce a poté uvolní monitor, což umožní ostatním streamům zachytit jej a spustit jejich synchronizované bloky.

Použití klíčového slova synchronized umožňuje zajistit, aby pouze jeden tok provedl blok kódu označený jako synchronizovaný v určitém okamžiku, což zabraňuje vzniku stavu závodu a nejistému chování. Synchronizované bloky tak umožňují správné a konzistentní fungování vícevláknových aplikací v Javě.

Mechanismus synchronizace vláken

V jazyce Java je synchronizační mechanismus implementován pomocí klíčového slova synchronized. Lze jej použít na metody a bloky kódu.

Když je metoda nebo blok kódu oznámen jako synchronizovaný, je k nim přístup synchronizován a lze jej provést pouze jedním tokem v určitém okamžiku. Ostatní toky budou čekat, až bude zdroj uvolněn.

Chcete-li použít synchronizaci vláken, musíte určit objekt nebo třídu, kde bude synchronizace probíhat. Může to být monitorovací objekt, který umožňuje vzájemné vylučování a kontrolu přístupu ke zdrojům. Objekt Monitor je obvykle sdílený zdroj, ke kterému má přístup více vláken.

Synchronizace streamů umožňuje vyhnout se stavu závodu, kdy se více streamů snaží přistupovat ke stejnému zdroji současně, což může vést k nepředvídatelnému chování programu. Zajišťuje také atomaritu operací, to znamená, že zajistí, že jedna operace bude provedena celá bez přerušení jinými proudy.

Zámky a monitory v jazyce Java

V jazyce Java existuje synchronizační mechanismus, který umožňuje bezpečný přístup ke sdílenému prostředku pro více vláken. K tomu slouží Klíčové slovo synchronized, díky kterému lze vytvářet zámky a monitory.

Zámek v jazyce Java je mechanismus, který umožňuje toku zachytit přístup ke sdílenému prostředku a podržet jej, dokud nebude zámek uvolněn. To poskytuje synchronizovaný přístup ke sdílené paměti a zabraňuje stavu závodu.

Monitor v jazyce Java je koncept související s blokováním. Jedná se o abstraktní objekt, se kterým je zámek spojen. K monitoru může být připojen pouze jeden proud, který vlastní zámek a má k němu exkluzivní přístup. Pokud se druhý stream pokusí získat přístup k uzamčenému monitoru, zablokuje se a čeká, až bude monitor uvolněn.

Klíčové slovo synchronized se používá k vytváření zámků a monitorů v Javě. Lze jej použít v několika formách, včetně blokování metod, bloků kódu nebo polí objektů. Když stream vstoupí do blokovaného kódu, získá přístup k monitoru souvisejícímu s tímto kódem a jiný Stream nemá přístup k tomuto monitoru, dokud nebude uvolněn.

Forma použitíPopis
synchronizovaná metoda Blokuje přístup k celé metodě, což umožňuje pouze jednomu toku provést jej v daném okamžiku.
synchronized(this) Blokuje přístup k bloku kódu, jehož spuštění lze provést pouze jedním tokem současně.
synchronized (objekt) Blokuje přístup k bloku kódu, jehož spuštění lze provést pouze jedním tokem současně. Jako blokovací objekt může být použit jakýkoli objekt.
synchronizovaná statická metoda Blokuje přístup k celé statické metodě, což umožňuje pouze jednomu toku provést jej v daném okamžiku.
synchronized (třída.class) Blokuje přístup k bloku kódu, jehož spuštění lze provést pouze jedním tokem současně. Jako blokovací objekt se používá třída.

Synchronizace kódu pomocí klíčového slova synchronized je jedním z hlavních mechanismů v jazyce Java pro zabezpečení toku. Měli byste však být opatrní s jeho používáním, abyste se vyhnuli problémům s výkonem a dedlokům.

Příklady použití synchronized

Při práci s vlákny v jazyce Java hraje Klíčové slovo synchronized důležitou roli při zajišťování správné synchronizace přístupu ke sdíleným zdrojům. Zvažte několik příkladů použití synchronized k zajištění bezpečnosti práce se sdílenými daty.

Příklad 1:

Ať máme třídu Counter, která představuje počítadlo s metodami increment () a decrement (). Pokud synchronized nepoužijeme, pak je možná situace, kdy dva proudy naráz zvýší měřič, což povede k nesprávným výsledkům. Abyste se této situaci vyhnuli, můžete použít synchronized k blokování přístupů k metodám increment () a decrement () :

class Counter public synchronized void decrement() public int getCount() >

Nyní bude přístup k metodám increment() a decrement() zajištěn spolehlivě, protože pouze jeden tok bude schopen změnit hodnotu měřiče v jednom časovém okamžiku.

Příklad 2:

Dalším běžným příkladem použití synchronized je práce se sbírkami, které se používají ve více vláknech. Zvažte například následující kód:

class ThreadSafeListExample list = new ArrayList<>();public void addItem(String item) >public void removeItem(String item) >public List getList() (list);>>>

Zde jsme při přidávání a odstraňování položek použili blokování objektu list. Tímto způsobem zajistíme, že pouze jeden tok může změnit seznam v jednom okamžiku. Kromě toho, když se položky seznamu vrátí metodou getList (), vytvoříme jeho kopii pomocí new ArrayList<>(list), abychom se vyhnuli možné konkurenci o přístup k prvkům.

Příklady použití synchronized umožňují zajistit bezpečnost práce se společnými daty v prostředí s více vlákny a vyhnout se závodním situacím a nepředvídatelnému chování programu.