A Java, la sincronització és crucial en la programació simultània quan diversos fils accedeixen a recursos compartits. Assegura que només un fil accedeix a una secció crítica alhora, evitant la inconsistència de les dades. La sincronització es pot aplicar a mètodes o blocs de codi. Sincronització entre mètodes i blocs
cadena de matriu c
Tipus de sincronització
- Sincronització del mètode: Bloqueja tot el mètode per assegurar-se que només un fil l'executa alhora.
- Sincronització de blocs: Bloqueja només la secció crítica del codi dins d'un mètode.
La sincronització és necessària per als objectes mutables als quals accedeixen diversos fils. Els objectes immutables o l'accés de només lectura no requereixen sincronització.
Sincronització de mètodes
Per sincronitzar un mètode, afegiu la paraula clau sincronitzada. Això garanteix que només un fil pot executar el mètode alhora.
Exemple 1: Mètode no sincronitzat
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(); } }
Sortida
0 0 1 1 2 2
Explicació: Els fils t1 i t2 accedeixen al mètode simultàniament provocant una sortida mixta.
Exemple 2: Mètode sincronitzat
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(); } }
Sortida
0 1 2 0 1 2
Explicació: Només un fil executa el mètode alhora, garantint la coherència de les dades.
com convertir de cadena a int
Sincronització de blocs
La sincronització de blocs s'utilitza quan només una part d'un mètode conté codi crític. Això millora el rendiment en permetre que els fils executin codi no crític simultàniament.
Exemple: Bloc sincronitzat
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); } }
Sortida
Mohit
Explicació: Només es sincronitza el nom i el nombre d'actualització del bloc. L'addició de noms a la llista s'executa simultàniament.
Mètode vs Sincronització de blocs
| Característica | Sincronització de mètodes | Sincronització de blocs |
|---|---|---|
| Àmbit | Bloqueja tot el mètode | Bloqueja només el bloc específic de codi |
| Rendiment | Pot provocar un bloqueig innecessari per a codi no crític | Més eficient només es sincronitzen les seccions crítiques |
| Bloqueig | Adquireix el bloqueig a l'objecte del mètode | Adquireix el bloqueig a l'objecte o classe especificat al bloc |
| Flexibilitat | Tot el mètode menys flexible està bloquejat | Més flexible permet una sincronització selectiva |
Punts importants
- Un fil que entra en un mètode/bloc sincronitzat adquireix un bloqueig que l'allibera en sortir.
- Mètodes/blocs d'instància: Adquirir bloqueig a nivell d'objecte.
- Mètodes/blocs estàtics: Adquirir bloqueig a nivell de classe.
- La sincronització d'objectes nuls genera NullPointerException.
- wait() notify() i notifyAll() són mètodes clau en la sincronització.
- Eviteu sincronitzar camps no finals per evitar que els fils bloquegin diferents objectes.
- La paraula clau sincronitzada no es pot aplicar a les variables.
Avantatges
- Assegura l'exclusió mútua dels recursos compartits en programes multiprocés.
- Tant la instància sincronitzada com els mètodes estàtics es poden executar simultàniament perquè bloquegen objectes diferents.
Limitacions
- Evita que les lectures concurrents limiten la concurrència.
- Els mètodes sincronitzats poden degradar el rendiment. Preferiu la sincronització de blocs només per a les seccions crítiques.