JavaRush /Blog Java /Random-FR /Synchronisation des threads, verrouillage des objets et v...
CynepHy6
Niveau 34
Великий Новгород

Synchronisation des threads, verrouillage des objets et verrouillage des classes

Publié dans le groupe Random-FR
Synchronisation des threads, verrouillage des objets et verrouillage des classes - 1La synchronisation fait référence au multithreading. Un bloc de code synchronisé ne peut être exécuté que par un seul thread à la fois. Java prend en charge plusieurs threads pour l'exécution. Cela pourrait entraîner l'accès de deux ou plusieurs threads au même champ ou objet. La synchronisation est un processus qui permet à tous les threads parallèles d'un programme de s'exécuter de manière synchrone. La synchronisation évite les erreurs de cohérence de la mémoire causées par un accès incohérent à la mémoire partagée. Lorsqu'une méthode est déclarée synchronisée, le thread détient un moniteur pour l'objet dont la méthode est en cours d'exécution. Si un autre thread exécute une méthode synchronisée, votre thread se bloquera jusqu'à ce que l'autre thread libère le moniteur. La synchronisation est réalisée en Java à l'aide d'un mot réservé synchronized. Vous pouvez l'utiliser dans vos classes en définissant des méthodes ou des blocs synchronisés. Vous ne pourrez pas utiliser synchronizedde variables ou d'attributs dans une définition de classe.

Verrouillage au niveau de l'objet

Il s'agit d'un mécanisme permettant de synchroniser une méthode non statique ou un bloc de code non statique de telle sorte qu'un seul thread puisse exécuter un bloc ou une méthode donné sur une instance donnée d'une classe. Cela doit être fait chaque fois que vous avez besoin de sécuriser les threads de données au niveau de l'instance. Exemple:
public class DemoClass{
    public synchronized void demoMethod(){}
}
ou
public class DemoClass{
    public void demoMethod(){
        synchronized (this)        {
            //other thread safe code
        }
    }
}
ou
public class DemoClass{
    private final Object lock = new Object();
    public void demoMethod(){
        synchronized (lock)        {
            //other thread safe code
        }
    }
}

Verrouillage au niveau de la classe

Empêche plusieurs threads d'entrer dans un bloc synchronisé pendant l'exécution dans l'une des instances disponibles de la classe. Cela signifie que s'il y a 100 instances de la classe pendant l'exécution du programme DemoClass, alors un seul thread à ce moment-là pourra s'exécuter demoMethod()dans n'importe lequel des cas, et tous les autres cas seront bloqués pour les autres threads. Cela est nécessaire lorsque vous devez sécuriser les threads de données statiques.
public class DemoClass{
    public synchronized static void demoMethod(){}
}
ou
public class DemoClass{
    public void demoMethod(){
        synchronized (DemoClass.class)        {
            //other thread safe code
        }
    }
}
ou
public class DemoClass
{
    private final static Object lock = new Object();
    public void demoMethod(){
        synchronized (lock)        {
            //other thread safe code
        }
    }
}

Quelques remarques importantes

  1. La synchronisation en Java garantit qu'aucun thread ne peut exécuter une méthode synchronisée en même temps ou en parallèle.

  2. synchronizedne peut être utilisé qu'avec des méthodes et des blocs de code. Ces méthodes ou blocs peuvent être statiques ou non statiques.

  3. Chaque fois qu'un thread entre dans une méthode synchronisée ou bloque, il acquiert un verrou et chaque fois qu'un thread quitte une méthode synchronisée ou bloque, la JVM libère le verrou. Le verrou est libéré même si le thread quitte la méthode synchronisée une fois terminé en raison d'erreurs ou d'exceptions.

  4. synchronizeden Java , cela signifie que si une méthode synchronisée appelle une autre méthode synchronisée qui nécessite le même verrou, le thread actuel qui détient le verrou peut entrer dans cette méthode sans acquérir le verrou.

  5. Синхронизация в Java будет бросать NullPointerException если an object используемый в синхронизированном блоке null. Например, в вышеприведенном примере codeа, если замок инициализируется How null, синхронизированный (lock) бросит NullPointerException.

  6. Синхронизированные методы в Java вносят дополнительные затраты на производительность вашего applications. Так что используйте синхронизацию, когда она абсолютно необходима. Кроме того, рассмотрите вопрос об использовании синхронизированных блоков codeа для синхронизации только критических секций codeа.

  7. Вполне возможно, что и статический и не статический синхронизированные методы могут работать одновременно or параллельно, потому что они захватывают замок на другой an object.

  8. В соответствии со спецификацией языка вы не можете использовать synchronized в конструкторе это приведет к ошибке компиляции.

  9. Не синхронизируйте по не финальному (no final) полю, потому что link, на не финальное поле может измениться в любое время, а затем другой поток может получить синхронизацию на разных an objectх и уже не будет ниHowой синхронизации вообще. Лучше всего использовать класс String, который уже неизменяемый и финальный.

Удачи в обучении!! Оригинал: Object level lock vs Class level lock in Java
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION