În Java, sincronizarea este crucială în programarea simultană atunci când mai multe fire accesează resurse partajate. Se asigură că doar un fir accesează o secțiune critică la un moment dat, prevenind inconsecvența datelor. Sincronizarea poate fi aplicată metodelor sau blocurilor de cod. Sincronizare metoda vs. bloc
scrieți json în fișierul python
Tipuri de sincronizare
- Sincronizarea metodei: Blocează întreaga metodă pentru a se asigura că o execută un singur fir la un moment dat.
- Sincronizare bloc: Blocează numai secțiunea critică a codului dintr-o metodă.
Sincronizarea este necesară pentru obiectele mutabile accesate de mai multe fire. Obiectele imuabile sau accesul numai în citire nu necesită sincronizare.
Sincronizarea metodei
Pentru a sincroniza o metodă, adăugați cuvântul cheie sincronizat. Acest lucru asigură că doar un fir poate executa metoda la un moment dat.
Exemplul 1: Metoda nesincronizată
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(); } }
Ieșire
0 0 1 1 2 2
Explicaţie: Firele t1 și t2 accesează metoda provocând concomitent ieșiri mixte.
înlocuire șir de caractere javascript
Exemplul 2: Metoda sincronizată
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(); } }
Ieșire
0 1 2 0 1 2
Explicaţie: Doar un fir execută metoda la un moment dat, asigurând consistența datelor.
Sincronizare bloc
Sincronizarea blocurilor este utilizată atunci când doar o parte a unei metode conține cod critic. Acest lucru îmbunătățește performanța permițând firelor de execuție să execute simultan cod non-critic.
Exemplu: bloc sincronizat
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); } }
Ieșire
Mohit
Explicaţie: Numai numele și numărul de actualizare a blocului sunt sincronizate. Adăugarea de nume la listă rulează simultan.
Metodă vs Sincronizare bloc
| Caracteristică | Sincronizarea metodei | Sincronizare bloc |
|---|---|---|
| Domeniul de aplicare | Blocează întreaga metodă | Blocează numai blocul specific de cod |
| Performanţă | Poate provoca blocări inutile pentru codul care nu este critic | Mai eficient doar secțiunile critice sunt sincronizate |
| Blocare | Obține blocarea obiectului metodei | Obține blocarea obiectului sau clasei specificate în bloc |
| Flexibilitate | Întreaga metodă mai puțin flexibilă este blocată | Mai flexibil permite sincronizarea selectivă |
Puncte importante
- Un fir de execuție care intră într-o metodă/bloc sincronizat dobândește o blocare și o eliberează la ieșire.
- Metode de instanță/blocuri: Obțineți blocare la nivel de obiect.
- Metode/blocuri statice: Obțineți blocare la nivel de clasă.
- Sincronizarea pe obiecte nul aruncă NullPointerException.
- wait() notify() și notifyAll() sunt metode cheie în sincronizare.
- Evitați sincronizarea câmpurilor non-finale pentru a împiedica firele de execuție să blocheze diferite obiecte.
- cuvântul cheie sincronizat nu poate fi aplicat variabilelor.
Avantaje
- Asigură excluderea reciprocă a resurselor partajate în programele cu mai multe fire.
- Atât metodele de instanță sincronizată, cât și cele statice pot rula simultan, deoarece blochează obiecte diferite.
Limitări
- Previne citirile concurente limitând concurența.
- Metodele sincronizate pot degrada performanța. Preferați sincronizarea blocurilor numai pentru secțiunile critice.