A Java-ban a szinkronizálás kulcsfontosságú a párhuzamos programozásban, amikor több szál fér hozzá a megosztott erőforrásokhoz. Biztosítja, hogy egyszerre csak egy szál férjen hozzá egy kritikus szakaszhoz, elkerülve az adatok inkonzisztenciáját. A szinkronizálás metódusokra vagy kódblokkokra alkalmazható. Method vs Block Synchronization
udp protokoll
A szinkronizálás típusai
- Módszer szinkronizálás: Zárolja a teljes metódust, hogy egyszerre csak egy szál hajtsa végre.
- Blokk szinkronizálás: A metóduson belül csak a kód kritikus részét zárolja.
Szinkronizálás szükséges a több szálon keresztül elérhető, változtatható objektumokhoz. A megváltoztathatatlan objektumok vagy az írásvédett hozzáférés nem igényel szinkronizálást.
Módszer szinkronizálás
Egy metódus szinkronizálásához adja hozzá a szinkronizált kulcsszót. Ez biztosítja, hogy egyszerre csak egy szál tudja végrehajtani a metódust.
1. példa: Nem szinkronizált módszer
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(); } }
Kimenet
0 0 1 1 2 2
Magyarázat: A t1 és t2 szálak egyszerre érik el a metódust, ami vegyes kimenetet okoz.
java oops fogalmak
2. példa: Szinkronizált módszer
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(); } }
Kimenet
0 1 2 0 1 2
Magyarázat: Egyszerre csak egy szál hajtja végre a metódust, biztosítva az adatok konzisztenciáját.
Blokk szinkronizálás
A blokkszinkronizálást akkor használják, ha a metódusnak csak egy része tartalmaz kritikus kódot. Ez javítja a teljesítményt azáltal, hogy lehetővé teszi a szálak nem kritikus kódok egyidejű futtatását.
Példa: Szinkronizált blokk
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); } }
Kimenet
Mohit
Magyarázat: Csak a blokkfrissítés neve és száma szinkronizálódik. A nevek listához való hozzáadása párhuzamosan fut.
Módszer vs blokk szinkronizálás
| Funkció | Módszer szinkronizálás | Blokk szinkronizálás |
|---|---|---|
| Hatály | Lezárja a teljes módszert | Csak az adott kódblokkot zárolja |
| Teljesítmény | Szükségtelen blokkolást okozhat a nem kritikus kódoknál | Hatékonyabban csak a kritikus szakaszok szinkronizálódnak |
| Zár | Megszerzi a zárolást a metódus objektumán | Megszerzi a blokkban megadott objektum vagy osztály zárolását |
| Rugalmasság | A kevésbé rugalmas teljes módszer zárolva van | Rugalmasabb lehetővé teszi a szelektív szinkronizálást |
Fontos pontok
- A szinkronizált metódusba/blokkba belépő szál zárolást kap, és kilépéskor feloldja.
- Példánymódszerek/blokkok: Objektumszintű zárolás beszerzése.
- Statikus módszerek/blokkok: Osztályszintű zárolás beszerzése.
- A null objektumok szinkronizálása NullPointerException kivételt eredményez.
- A wait() notify() és a notifyAll() kulcsfontosságú metódusok a szinkronizálásban.
- Kerülje a nem végleges mezők szinkronizálását, nehogy a szálak zárolják a különböző objektumokat.
- szinkronizált kulcsszó nem alkalmazható változókra.
Előnyök
- Biztosítja a megosztott erőforrások kölcsönös kizárását a többszálú programokban.
- Mind a szinkronizált példány, mind a statikus metódusok futhatnak egyidejűleg, mert különböző objektumokat zárolnak.
Korlátozások
- Megakadályozza, hogy az egyidejű olvasás korlátozza az egyidejűséget.
- A szinkronizált módszerek ronthatják a teljesítményt. Csak a kritikus szakaszok blokkszinkronizálását részesítse előnyben.