Le mot-clé synchronized en Java contrôle l'accès aux ressources partagées entre plusieurs threads. Il garantit qu'un seul thread peut exécuter un bloc ou une méthode synchronisé(e) à la fois, ce qui évite les interférences entre les threads et garantit la cohérence de la mémoire.
Utilisation
Le mot-clé synchronized peut être appliqué à des méthodes ou à des blocs dans des méthodes. Lorsqu'une méthode ou un bloc est déclaré comme étant synchronisé, un verrou est obtenu sur l'objet spécifié et les autres threads ne peuvent pas accéder au code synchronisé tant que le verrou n'est pas libéré.
Syntax
Méthode synchronisée
public synchronized voidsynchronizedMethod(){// method code}Propulsé par
Bloc synchronisé
publicvoidmethod(){synchronized(object){// synchronized code}}Propulsé par
object: L'objet sur lequel la synchronisation doit être effectuée. Il s'agit généralement de l'instance actuelle (this) ou d'un objet spécifique.
Exemples
Exemple 1 : Méthode synchronisée
publicclassCounter{private int count =0;public synchronized voidincrement(){
count++;}public int getCount(){return count;}publicstaticvoidmain(String[] args){
Counter counter =newCounter();// Create multiple threads to increment the counter
Thread t1 =newThread(()-> counter.increment());
Thread t2 =newThread(()-> counter.increment());
t1.start();
t2.start();try{
t1.join();
t2.join();}catch(InterruptedException e){
e.printStackTrace();}
System.out.println("Final count: "+ counter.getCount());}}Propulsé par
Dans cet exemple, la méthode increment est synchronisée, ce qui garantit qu'un seul thread peut incrémenter le compteur à la fois, évitant ainsi les conditions de course.
Exemple 2 : Bloc synchronisé
publicclassSynchronizedBlockExample{private final Object lock =newObject();private int count =0;publicvoidincrement(){synchronized(lock){
count++;}}public int getCount(){return count;}publicstaticvoidmain(String[] args){
SynchronizedBlockExample example =newSynchronizedBlockExample();// Create multiple threads to increment the counter
Thread t1 =newThread(()-> example.increment());
Thread t2 =newThread(()-> example.increment());
t1.start();
t2.start();try{
t1.join();
t2.join();}catch(InterruptedException e){
e.printStackTrace();}
System.out.println("Final count: "+ example.getCount());}}Propulsé par
Cet exemple utilise un bloc synchronisé pour contrôler l'accès à la variable count. L'objet de verrouillage garantit qu'un seul thread peut exécuter le bloc synchronisé à la fois.
Conseils et bonnes pratiques
Réduire au minimum le code synchronisé: Les blocs synchronisés doivent être aussi courts que possible afin de réduire les conflits et d'améliorer les performances.
Utilisez les objets finaux: Lorsque vous utilisez des blocs synchronisés, utilisez des objets finaux comme verrous pour garantir la cohérence.
Évitez les synchronisations imbriquées: Les blocs synchronisés imbriqués peuvent entraîner des blocages. Évitez-les ou utilisez-les avec prudence.
Utilisez des collections simultanées: Pour une synchronisation complexe, envisagez d'utiliser les collections concurrentes du paquetage java.util.concurrent, telles que ConcurrentHashMap, qui fournissent une synchronisation intégrée.
Volatile Mot-clé: Pour les variables auxquelles accèdent plusieurs threads, mais qui ne nécessitent pas de synchronisation complexe, envisagez d'utiliser le mot-clé volatile pour garantir la visibilité.
Sécurité du fil: Veillez toujours à ce que les ressources partagées soient correctement synchronisées afin de maintenir la sécurité des threads et d'éviter la corruption des données.
Méthodes statiques synchronisées: Synchronisez les méthodes statiques afin d'assurer un accès synchronisé au niveau de la classe, en veillant à ce qu'un seul thread puisse exécuter la méthode statique dans toutes les instances.
publicstatic synchronized voidstaticMethod(){// method code}Propulsé par
Réentrance: Les verrous intrinsèques de Java sont réentrants, ce qui signifie que si un thread détient un verrou, il peut l'acquérir à nouveau sans se bloquer lui-même.
Le mot-clé
synchronizeden Java contrôle l'accès aux ressources partagées entre plusieurs threads. Il garantit qu'un seul thread peut exécuter un bloc ou une méthode synchronisé(e) à la fois, ce qui évite les interférences entre les threads et garantit la cohérence de la mémoire.Utilisation
Le mot-clé
synchronizedpeut être appliqué à des méthodes ou à des blocs dans des méthodes. Lorsqu'une méthode ou un bloc est déclaré comme étant synchronisé, un verrou est obtenu sur l'objet spécifié et les autres threads ne peuvent pas accéder au code synchronisé tant que le verrou n'est pas libéré.Syntax
Méthode synchronisée
Bloc synchronisé
object: L'objet sur lequel la synchronisation doit être effectuée. Il s'agit généralement de l'instance actuelle (this) ou d'un objet spécifique.Exemples
Exemple 1 : Méthode synchronisée
Dans cet exemple, la méthode
incrementest synchronisée, ce qui garantit qu'un seul thread peut incrémenter le compteur à la fois, évitant ainsi les conditions de course.Exemple 2 : Bloc synchronisé
Cet exemple utilise un bloc synchronisé pour contrôler l'accès à la variable
count. L'objet de verrouillage garantit qu'un seul thread peut exécuter le bloc synchronisé à la fois.Conseils et bonnes pratiques
java.util.concurrent, telles queConcurrentHashMap, qui fournissent une synchronisation intégrée.volatilepour garantir la visibilité.