logo

Metoda Java și sincronizarea blocurilor

Î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ă

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();  } } 

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ă

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();  } } 

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

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);  } } 

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 metodeiSincronizare bloc
Domeniul de aplicare Blocează întreaga metodăBlocează numai blocul specific de cod
Performanţă Poate provoca blocări inutile pentru codul care nu este criticMai eficient doar secțiunile critice sunt sincronizate
Blocare Obține blocarea obiectului metodeiObț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.
Creați un test