logo

Méthode Java et synchronisation des blocs

En Java, la synchronisation est cruciale en programmation simultanée lorsque plusieurs threads accèdent à des ressources partagées. Il garantit qu'un seul thread accède à une section critique à la fois, évitant ainsi toute incohérence des données. La synchronisation peut être appliquée à des méthodes ou à des blocs de code. Synchronisation méthode vs bloc

qu'est-ce qu'un hashset en Java

Types de synchronisation

  • Synchronisation des méthodes : Verrouille l'intégralité de la méthode pour garantir qu'un seul thread l'exécute à la fois.
  • Synchronisation des blocs : Verrouille uniquement la section critique du code dans une méthode.

La synchronisation est requise pour les objets mutables accessibles par plusieurs threads. Les objets immuables ou l'accès en lecture seule ne nécessitent pas de synchronisation.

Synchronisation des méthodes

Pour synchroniser une méthode, ajoutez le mot-clé synchronisé. Cela garantit qu'un seul thread peut exécuter la méthode à la fois.



Exemple 1 : méthode non synchronisée

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

Sortir
0 0 1 1 2 2 

Explication: Les threads t1 et t2 accèdent simultanément à la méthode, provoquant une sortie mixte.

Exemple 2 : méthode synchronisée

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

Sortir
0 1 2 0 1 2 

Explication: Un seul thread exécute la méthode à la fois, garantissant la cohérence des données.

Synchronisation des blocs

La synchronisation par blocs est utilisée lorsque seule une partie d'une méthode contient du code critique. Cela améliore les performances en permettant aux threads d'exécuter du code non critique simultanément.

opérateur ternaire java

Exemple : bloc synchronisé

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

Sortir
Mohit 

Explication: Seuls le nom et le nombre de mises à jour du bloc sont synchronisés. L'ajout de noms à la liste s'effectue simultanément.

Synchronisation méthode vs bloc

FonctionnalitéSynchronisation des méthodesSynchronisation des blocs
Portée Verrouille toute la méthodeVerrouille uniquement le bloc de code spécifique
Performance Peut provoquer un blocage inutile pour le code non critiquePlus efficace, seules les sections critiques sont synchronisées
Verrouillage Acquiert le verrou sur l'objet de la méthodeAcquiert le verrou sur l'objet ou la classe spécifié dans le bloc
Flexibilité La méthode entière, moins flexible, est verrouilléePlus flexible, permet une synchronisation sélective

Points importants

  • Un thread entrant dans une méthode/un bloc synchronisé acquiert un verrou et le libère à la sortie.
  • Méthodes/blocs d’instance : acquérir un verrouillage au niveau de l’objet.
  • Méthodes/blocs statiques : acquérir un verrou au niveau de la classe.
  • La synchronisation sur des objets nuls lève NullPointerException.
  • wait() notify() et notifyAll() sont des méthodes clés dans la synchronisation.
  • Évitez de synchroniser les champs non finaux pour empêcher les threads de verrouiller différents objets.
  • Le mot-clé synchronisé ne peut pas être appliqué aux variables.

Avantages

  • Garantit l’exclusion mutuelle des ressources partagées dans les programmes multithread.
  • Les méthodes d'instance synchronisée et statiques peuvent s'exécuter simultanément car elles verrouillent des objets différents.

Limites

  • Empêche les lectures simultanées en limitant la simultanéité.
  • Les méthodes synchronisées peuvent dégrader les performances. Préférez la synchronisation des blocs pour les sections critiques uniquement.
Créer un quiz