• Home
  • Docker
  • Kubernetes
  • LLMs
  • Java
  • Ubuntu
  • Maven
  • Big Data
  • Archived
Java | Verrouillage et synchronisation (locks and synchronization)
  1. Introduction
  2. Synchroniser une méthode
  3. Synchroniser un bloc de code
  4. Verrouiller une instance : Class ou Object

  1. Introduction
    Le verrouillage est un mécanisme qui permet aux threads d'avoir un accès exclusif aux méthodes synchronisées d'une instance ; les méthodes synchronisées d'une instance verrouillée par un thread ne sont pas accessibles par les autres threads. Les autres threads doivent attendre que l'instance soit déverrouillée pour qu'ils puissent essayer à leur tour d'acquérir le verrou sur cette instance et ainsi pouvoir accéder à ses méthodes synchronisées.

    Notes :
    • Chaque thread peut avoir un ou plusieurs verrous.

    • Une instance est verrouillée par un seul thread à la fois, et ce verrou n'affectera pas les autres instances qui peuvent être verrouillées par d'autres threads.

    • Seules les méthodes synchronisées d'une instance sont impactées par le verrou acquis sur cette instance ; les autres méthodes non-synchronisées de l'instance restent accessibles pour tous les threads.

    • Un thread qui obtient le verrou sur une instance peut accéder à toutes les méthodes synchronisées de cette instance.

    • La synchronisation est applicable uniquement aux méthodes.
  2. Synchroniser une méthode
    Une méthode est synchronisée lorsqu'elle est marquée par le mot clé synchronized.

    Lorsqu'une méthode synchronisée est invoquée, le thread courant obtient un verrou sur l'instance référée par cet appel, à condition que cette instance ne soit pas déjà verrouillée par un autre thread.

    Si une instance est déjà verrouillée par un thread, alors aucun autre thread ne peut avoir un verrou sur cette instance et par conséquent aucun autre thread ne peut exécuter les méthodes synchronisées de cette instance.

    Chaque thread qui essaye d'acquérir le verrou sur une instance déjà verouille, sera mis en attente jusqu'à ce que l'instance soit déverrouillée.

    Tant que l'exécution de la méthode synchronisée n'est pas terminée, le thread qui possède le verrou ne libère pas ce verrou et cela même si ce thread n'est plus dans l'état d'exécution (il est endormit par exemple).


    Résultat d'exécution du code :
  3. Synchroniser un bloc de code
    La différence entre la synchronisation d'une méthode et la synchronisation d'un bloc de code et que ce dernier permet de spécifier l'instance que l'on souhaite verrouiller ; alors que la synchronisation d'une méthode est toujours faite sur l'instance dont le code est en cours d'exécution.

    La synchronisation d'une méthode peut toujours être remplacée par une synchronisation d'un bloc de code. Le code précédent peut être remplacé par le suivant :

  4. Verrouiller une instance : Class ou Object
    Souvent, lorsqu'on parle des instances on fait référence aux objets qui représentent des instances de la classe Object.
    Mais chaque classe Java (code source) a aussi une instance de la classe Class ; cette instance est créée automatiquement par la JVM lorsqu'elle charge en mémoire le code source de cette classe en mémoire.

    Une classe Java T peut avoir donc deux types d'instances en mémoire :
    • Une seule instance de la classe Class qui représente une classe Java T est créée automatiquement par la JVM lorsque la classe T est utilisée pour la déclaration d'une variable.
      L'instance de la classe peut aussi être créée explicitement en utilisant la méthode forName de la classe Class (Class.forName("T")).
      Cette instance est utilisée pour accéder aux membres statiques de la classe.
      Lorsque une méthode statique est synchronisée, alors le verrouillage est appliquée sur cette instance.

    • Une ou plusieurs instances qui représentent les objets créés à partir d'une classe Java T en utilisant l'opérateur new (new T()).
      Ces instances sont utilisées, typiquement, pour accéder aux membres non-statiques de la classe.
      Lorsque une méthode non-statique est synchronisée, alors le verrouillage est appliquée sur l'instance dont le code est en cours d'exécution.

    Il faut noter que le verouillage obtenu lors de l'appel d'une méthode statique synchronisée d'une classe est différent de celui obtenu lors de l'appel d'une méthode non-statique synchronisée de la même classe. Les deux verrous peuvent êtres obtenus par deux threads différents.
© 2025  mtitek