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
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(); } }
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
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(); } }
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é
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); } }
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éthodes | Synchronisation des blocs |
|---|---|---|
| Portée | Verrouille toute la méthode | Verrouille uniquement le bloc de code spécifique |
| Performance | Peut provoquer un blocage inutile pour le code non critique | Plus efficace, seules les sections critiques sont synchronisées |
| Verrouillage | Acquiert le verrou sur l'objet de la méthode | Acquiert le verrou sur l'objet ou la classe spécifié dans le bloc |
| Flexibilité | La méthode entière, moins flexible, est verrouillée | Plus 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.