logo

Mètode Java i sincronització de blocs

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

Java
class 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

Java
class 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

Java
import 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ísticaSincronització de mètodesSincronització de blocs
Àmbit Bloqueja tot el mètodeBloqueja només el bloc específic de codi
Rendiment Pot provocar un bloqueig innecessari per a codi no críticMés eficient només es sincronitzen les seccions crítiques
Bloqueig Adquireix el bloqueig a l'objecte del mètodeAdquireix el bloqueig a l'objecte o classe especificat al bloc
Flexibilitat Tot el mètode menys flexible està bloquejatMé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.
Crea un qüestionari