V Javě je synchronizace klíčová při souběžném programování, když více vláken přistupuje ke sdíleným zdrojům. Zajišťuje, že ke kritické sekci přistupuje vždy pouze jedno vlákno, což zabraňuje nekonzistenci dat. Synchronizace může být aplikována na metody nebo bloky kódu. Synchronizace mezi metodami a bloky
římská čísla 1 až 100
Typy synchronizace
- Synchronizace metod: Uzamkne celou metodu, aby bylo zajištěno, že ji provede vždy pouze jedno vlákno.
- Synchronizace bloku: Zamkne pouze kritickou část kódu v rámci metody.
Synchronizace je vyžadována pro měnitelné objekty, ke kterým přistupuje více vláken. Neměnné objekty nebo přístup pouze pro čtení nevyžadují synchronizaci.
Synchronizace metod
Pro synchronizaci metody přidejte synchronizované klíčové slovo. Tím je zajištěno, že metodu může spustit vždy pouze jedno vlákno.
Příklad 1: Nesynchronizovaná metoda
Javaclass Line { public void getLine() { for (int i = 0; i < 3; i++) { System.out.println(i); try { Thread.sleep(100); } catch (Exception e) { System.out.println(e); } } } } class Train extends Thread { Line line; Train(Line line) { this.line = line; } public void run() { line.getLine(); } } public class Geeks { public static void main(String[] args) { Line obj = new Line(); Train t1 = new Train(obj); Train t2 = new Train(obj); t1.start(); t2.start(); } }
Výstup
0 0 1 1 2 2
Vysvětlení: Vlákna t1 a t2 přistupují k metodě souběžně, což způsobuje smíšený výstup.
Příklad 2: Synchronizovaná metoda
Javaclass Line { synchronized public void getLine() { for (int i = 0; i < 3; i++) { System.out.println(i); try { Thread.sleep(100); } catch (Exception e) { System.out.println(e); } } } } class Train extends Thread { Line line; Train(Line line) { this.line = line; } public void run() { line.getLine(); } } public class Geeks { public static void main(String[] args) { Line obj = new Line(); Train t1 = new Train(obj); Train t2 = new Train(obj); t1.start(); t2.start(); } }
Výstup
0 1 2 0 1 2
Vysvětlení: Metodu provádí vždy pouze jedno vlákno, což zajišťuje konzistenci dat.
smyčky while a do while v Javě
Synchronizace bloku
Bloková synchronizace se používá, když pouze část metody obsahuje kritický kód. To zlepšuje výkon tím, že umožňuje vláknům spouštět nekritický kód souběžně.
Příklad: Synchronizovaný blok
Javaimport java.util.*; class Geek { String name = ''; public int count = 0; public void geekName(String geek List<String> list) { synchronized(this) { name = geek; count++; } list.add(geek); } } public class GFG { public static void main(String[] args) { Geek gk = new Geek(); List<String> list = new ArrayList<>(); gk.geekName('Mohit' list); System.out.println(gk.name); } }
Výstup
Mohit
Vysvětlení: Synchronizuje se pouze název a počet aktualizace bloku. Přidávání jmen do seznamu probíhá souběžně.
Metoda vs bloková synchronizace
| Funkce | Synchronizace metod | Synchronizace bloku |
|---|---|---|
| Rozsah | Uzamkne celou metodu | Zamkne pouze konkrétní blok kódu |
| Výkon | Může způsobit zbytečné blokování nekritického kódu | Efektivnější jsou synchronizovány pouze kritické sekce |
| Zámek | Získá zámek na objektu metody | Získá zámek na objekt nebo třídu zadanou v bloku |
| Flexibilita | Méně flexibilní celá metoda je uzamčena | Flexibilnější umožňuje selektivní synchronizaci |
Důležité body
- Vlákno vstupující do synchronizované metody/bloku získá zámek, který jej uvolní při ukončení.
- Metody/bloky instance: Získejte zámek na úrovni objektu.
- Statické metody/bloky: Získejte zámek na úrovni třídy.
- Synchronizace na null objektech vyvolá výjimku NullPointerException.
- wait() notify() a notifyAll() jsou klíčové metody synchronizace.
- Vyhněte se synchronizaci nefinálních polí, abyste zabránili vláknům zamykat různé objekty.
- synchronizované klíčové slovo nelze použít na proměnné.
Výhody
- Zajišťuje vzájemné vyloučení sdílených prostředků ve vícevláknových programech.
- Synchronizované instance i statické metody mohou běžet souběžně, protože zamykají různé objekty.
Omezení
- Zabraňuje souběžnému čtení a omezuje souběžnost.
- Synchronizované metody mohou snížit výkon. Preferujte synchronizaci bloků pouze pro kritické sekce.