Table des matières
1. Utilisez le mot-clé synchronisé
2. Utilisez la classe ReentrantLock
3. Utilisez la classe ConcurrentHashMap
4. Utilisez la classe Atomic
5. Utilisez la classe ThreadLocal
Pour résumer
Maison Java javaDidacticiel Introduction aux idées d'implémentation de la sécurité des threads en Java

Introduction aux idées d'implémentation de la sécurité des threads en Java

Jul 01, 2023 pm 02:54 PM
java


Dans la programmation multithread Java, la sécurité des threads est un concept très important. Un programme qui maintient un comportement correct lorsque plusieurs threads s'exécutent simultanément est dit thread-safe. Dans cet article, nous présenterons plusieurs idées d'implémentation courantes qui peuvent garantir la sécurité des threads en Java.

Introduction aux idées dimplémentation de la sécurité des threads en Java

1. Utilisez le mot-clé synchronisé

synchronized est le moyen le plus simple de résoudre les problèmes de sécurité des threads en Java. garantit que les blocs de code sont exécutés de manière atomique. Le mot-clé synchronisé peut être utilisé pour modifier les méthodes d'instance, les méthodes statiques et les blocs de code. Il s'agit d'un exemple de code de méthode d'instance, modifié à l'aide de synchronisé

public class Counter {
    private int count;
    public synchronized void increment() {
        count++;
    }
    public synchronized int getCount() {
        return count;
    }
}
Copier après la connexion

Dans le code ci-dessus, les méthodes incrément() et getCount() sont modifiées par synchronisé, ce qui garantit qu'un seul thread peut être utilisé à la fois. le temps Visitez-les. Bien que cette approche soit simple, elle est relativement inefficace car un seul thread à la fois est autorisé à accéder à ces méthodes.

2. Utilisez la classe ReentrantLock

La classe ReentrantLock en Java fournit un mécanisme de synchronisation de threads plus flexible que synchronisé. ReentrantLock est réentrant, peut interrompre les threads en attente du verrou et peut essayer d'acquérir le verrou via la méthode tryLock(). Ceci est un exemple de code pour assurer la sécurité des threads en utilisant ReentrantLock :

import java.util.concurrent.locks.ReentrantLock;
public class Counter {
    private int count;
    private ReentrantLock lock = new ReentrantLock();
    public void increment() {
        lock.lock();
        try {
            count++;
        } finally {
            lock.unlock();
        }
    }
    public int getCount() {
        lock.lock();
        try {
            return count;
        } finally {
            lock.unlock();
        }
    }
}
Copier après la connexion

Dans le code ci-dessus, le verrou est acquis en appelant la méthode lock.lock() et le verrou est libéré en appelant le verrou. méthode unlock(). Ce qu'il faut noter lors de l'utilisation de ReentrantLock, c'est que la logique d'acquisition et de libération du verrou doit être placée dans un bloc try-finally pour garantir que le verrou peut être libéré correctement.

3. Utilisez la classe ConcurrentHashMap

En Java, ConcurrentHashMap est une implémentation de table de hachage thread-safe. ConcurrentHashMap utilise un mécanisme de verrouillage de segment pour diviser l'intégralité de la table de hachage en plusieurs segments. Les éléments de différents segments sont accessibles par plusieurs threads en même temps. Voici un exemple de code qui utilise ConcurrentHashMap pour assurer la sécurité des threads :

import java.util.concurrent.ConcurrentHashMap;
public class Counter {
    private ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
    public void increment(String key) {
        map.put(key, map.getOrDefault(key, 0) + 1);
    }
    public int getCount(String key) {
        return map.getOrDefault(key, 0);
    }
}
Copier après la connexion

Dans le code ci-dessus, ConcurrentHashMap est utilisé pour stocker la valeur du compteur, ainsi que map.put() et map.getOrDefault. () les méthodes sont utilisées pour mettre à jour et obtenir la valeur du compteur. Étant donné que ConcurrentHashMap est thread-safe, cette implémentation garantit que la valeur du compteur est correcte lorsque plusieurs threads y accèdent en même temps.

4. Utilisez la classe Atomic

En Java, la classe Atomic fournit une série d'opérations atomiques pour garantir que les opérations sont effectuées de manière atomique. Les classes atomiques incluent AtomicBoolean, AtomicInteger, AtomicLong, etc. Voici un exemple de code qui démontre l'utilisation d'AtomicInteger pour assurer la sécurité des threads :

import java.util.concurrent.atomic.AtomicInteger;
public class Counter {
    private AtomicInteger count = new AtomicInteger();
    public void increment() {
        count.incrementAndGet();
    }
    public int getCount() {
        return count.get();
    }
}
Copier après la connexion

Dans le code ci-dessus, utilisez AtomicInteger pour stocker la valeur du compteur et utilisez la méthode count.incrementAndGet() pour mettre à jour la valeur du compteur. Étant donné qu'AtomicInteger est thread-safe, cette implémentation garantit que la valeur du compteur est correcte lorsque plusieurs threads y accèdent simultanément.

5. Utilisez la classe ThreadLocal

La classe ThreadLocal permet à chaque thread d'avoir sa propre copie de variables. Lorsque plusieurs threads s'exécutent simultanément, chaque thread peut fonctionner indépendamment. de la variable, évitant ainsi les problèmes de sécurité des threads. Voici un exemple de code qui utilise ThreadLocal pour assurer la sécurité des threads :

public class Counter {
    private ThreadLocal<Integer> threadLocal = ThreadLocal.withInitial(() -> 0);
    public void increment() {
        threadLocal.set(threadLocal.get() + 1);
    }
    public int getCount() {
        return threadLocal.get();
    }
}
Copier après la connexion

Dans le code ci-dessus, la classe ThreadLocal est utilisée pour stocker la valeur du compteur, et les fonctions threadLocal.set() et threadLocal Les méthodes .get() sont utilisées pour mettre à jour et obtenir la valeur du compteur. Définissez chaque thread pour avoir une copie indépendante de la variable afin de garantir que la valeur du compteur est exacte lorsque plusieurs threads y accèdent en même temps.

Pour résumer

Cet article présente plusieurs méthodes pour assurer la sécurité des threads en Java, notamment le mot-clé synchronisé, la classe ReentrantLock, la classe ConcurrentHashMap, la classe Atomic, la classe ThreadLocal, etc. En fonction des besoins réels, vous devez choisir une méthode adaptée. Chaque méthode a ses propres caractéristiques et scénarios applicables. Pour optimiser les performances et la concurrence du système, la sécurité des threads peut être obtenue en combinant plusieurs méthodes.

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 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

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Tags d'article chaud

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Racine carrée en Java Racine carrée en Java Aug 30, 2024 pm 04:26 PM

Racine carrée en Java

Nombre parfait en Java Nombre parfait en Java Aug 30, 2024 pm 04:28 PM

Nombre parfait en Java

Générateur de nombres aléatoires en Java Générateur de nombres aléatoires en Java Aug 30, 2024 pm 04:27 PM

Générateur de nombres aléatoires en Java

Numéro Armstrong en Java Numéro Armstrong en Java Aug 30, 2024 pm 04:26 PM

Numéro Armstrong en Java

Weka en Java Weka en Java Aug 30, 2024 pm 04:28 PM

Weka en Java

Numéro de Smith en Java Numéro de Smith en Java Aug 30, 2024 pm 04:28 PM

Numéro de Smith en Java

Questions d'entretien chez Java Spring Questions d'entretien chez Java Spring Aug 30, 2024 pm 04:29 PM

Questions d'entretien chez Java Spring

Break or Return of Java 8 Stream Forach? Break or Return of Java 8 Stream Forach? Feb 07, 2025 pm 12:09 PM

Break or Return of Java 8 Stream Forach?

See all articles