Maison > Java > javaDidacticiel > le corps du texte

À propos de la synchronisation des threads Java

巴扎黑
Libérer: 2017-04-15 09:06:07
original
1861 Les gens l'ont consulté

1、méthode synchronisée.

public synchronized void save(){}
Copier après la connexion
Copier après la connexion

2、bloc de code synchronisé.

synchronized(object){ 
}
Copier après la connexion
Copier après la connexion

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();
    }
}
Copier après la connexion
Copier après la connexion

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(){}
Copier après la connexion
Copier après la connexion

2、bloc de code synchronisé.

synchronized(object){ 
}
Copier après la connexion
Copier après la connexion

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();
    }
}
Copier après la connexion
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal