Maison  >  Article  >  Java  >  À propos de la synchronisation des threads Java

À propos de la synchronisation des threads Java

巴扎黑
巴扎黑original
2017-04-15 09:06:071873parcourir

1、méthode synchronisée.

public synchronized void save(){}

2、bloc de code synchronisé.

synchronized(object){ 
}

3、Utilisez des variables volatiles.
Utiliser volatile pour modifier un champ équivaut à indiquer à la machine virtuelle que le champ peut être mis à jour par d'autres threads, il doit donc être recalculé à chaque fois que le champ est utilisé au lieu d'utiliser la valeur dans le registre.

4、Utilisez le verrouillage réentrant (ReenreantLock)

public void save(int money) {
    lock.lock();
    try {
        account += money;
    } finally {
        lock.unlock();
    }
}

5、Utilisez la variable ThreadLocal, puis chaque thread utilisant la variable obtient une copie de la variable, et les copies sont indépendantes les unes des autres , afin que chaque thread puisse modifier sa propre copie de la variable à volonté sans affecter les autres threads.

6、Utiliser des files d'attente de blocage (LinkedBlockingQueue, etc.)

7、Utiliser des variables atomiques (AtomicInteger, etc.)

Résumé :
synchronisé :
Synchronisé est très adapté lorsqu'il y a une synchronisation occasionnelle. La raison en est que les compilateurs optimisent généralement la synchronisation autant que possible. La synchronisation est implémentée au niveau de la JVM. Non seulement les verrous synchronisés peuvent être surveillés via certains outils de surveillance, mais également si une exception se produit lors de l'exécution du code, la JVM libérera automatiquement le verrou.

ReentrantLock :
ReentrantLock fournit une variété de synchronisation, telles que la synchronisation limitée dans le temps, la synchronisation qui peut être interrompue (la synchronisation synchronisée ne peut pas être interrompue), etc. Lorsque la concurrence en matière de ressources n'est pas féroce, les performances sont légèrement pires que celles synchronisées. Mais lorsque la synchronisation est très intense, les performances de la synchronisation peuvent soudainement chuter des dizaines de fois. Et ReentrantLock peut en effet maintenir la normalité. Le verrouillage est implémenté via du code Pour garantir que le verrou sera libéré, unlock() doit être placé dansfinal{}.

Atomic :
Dans des situations moins intenses, la performance est légèrement pire que synchronisée, mais dans des situations intenses, elle peut maintenir la normalité. Dans des situations intenses, les performances d'Atomic seront environ deux fois supérieures à celles de ReentrantLock.


1、méthode synchronisée.

public synchronized void save(){}

2、bloc de code synchronisé.

synchronized(object){ 
}

3、Utilisez des variables volatiles.
Utiliser volatile pour modifier un champ équivaut à indiquer à la machine virtuelle que le champ peut être mis à jour par d'autres threads, il doit donc être recalculé à chaque fois que le champ est utilisé au lieu d'utiliser la valeur dans le registre.

4、Utilisez le verrouillage réentrant (ReenreantLock)

public void save(int money) {
    lock.lock();
    try {
        account += money;
    } finally {
        lock.unlock();
    }
}

5、Utilisez la variable ThreadLocal, puis chaque thread utilisant la variable obtient une copie de la variable, et les copies sont indépendantes les unes des autres , afin que chaque thread puisse modifier sa propre copie de la variable à volonté sans affecter les autres threads.

6、Utiliser des files d'attente de blocage (LinkedBlockingQueue, etc.)

7、Utiliser des variables atomiques (AtomicInteger, etc.)

Résumé :
synchronisé :
Synchronisé est très adapté lorsqu'il y a une synchronisation occasionnelle. La raison en est que les compilateurs optimisent généralement la synchronisation autant que possible. La synchronisation est implémentée au niveau de la JVM. Non seulement les verrous synchronisés peuvent être surveillés via certains outils de surveillance, mais également si une exception se produit lors de l'exécution du code, la JVM libérera automatiquement le verrou.

ReentrantLock :
ReentrantLock fournit une variété de synchronisation, telles que la synchronisation limitée dans le temps, la synchronisation qui peut être interrompue (la synchronisation synchronisée ne peut pas être interrompue), etc. Lorsque la concurrence en matière de ressources n'est pas féroce, les performances sont légèrement pires que celles synchronisées. Mais lorsque la synchronisation est très intense, les performances de la synchronisation peuvent soudainement chuter des dizaines de fois. Et ReentrantLock peut en effet maintenir la normalité. Le verrouillage est implémenté via du code Pour garantir que le verrou sera libéré, unlock() doit être placé dansfinal{}.

Atomic :
Dans des situations moins intenses, la performance est légèrement pire que synchronisée, mais dans des situations intenses, elle peut maintenir la normalité. Dans des situations intenses, les performances d'Atomic seront environ deux fois supérieures à celles de ReentrantLock.


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn