Maison  >  Article  >  Java  >  Explication détaillée du verrouillage de concurrence multithread Java

Explication détaillée du verrouillage de concurrence multithread Java

WBOY
WBOYoriginal
2024-04-11 16:21:01957parcourir

Le mécanisme de verrouillage de concurrence Java garantit que les ressources partagées ne sont accessibles que par un seul thread dans un environnement multithread. Ses types incluent le verrouillage pessimiste (acquérir le verrou puis accéder) et le verrouillage optimiste (vérifier les conflits après l'accès). Java fournit des classes de verrouillage de concurrence intégrées telles que ReentrantLock (verrouillage mutex), Semaphore (sémaphore) et ReadWriteLock (verrouillage en lecture-écriture). L'utilisation de ces verrous peut garantir un accès sécurisé aux ressources partagées, par exemple en garantissant que lorsque plusieurs threads accèdent au compteur de variable partagée en même temps, un seul thread met à jour sa valeur.

Explication détaillée du verrouillage de concurrence multithread Java

Explication détaillée du verrouillage de concurrence multithread Java

Introduction

Dans un environnement multithread, plusieurs threads peuvent accéder aux ressources partagées en même temps, ce qui entraîne une incohérence des données ou des erreurs de programme. Pour éviter cela, Java fournit un mécanisme de verrouillage de concurrence, qui garantit qu'un seul thread à la fois accède aux ressources partagées.

Types de verrous de concurrence

Il existe deux principaux types de verrous de concurrence en Java :

  • Verrouillage pessimiste : Il est supposé que tous les threads accéderont aux ressources partagées, le verrou est donc acquis avant d'accéder aux ressources partagées. Cela entraîne des changements de contexte plus fréquents, mais au prix d’une concurrence moindre.
  • Verrouillage optimiste : Supposez que la plupart des threads n'accéderont pas aux ressources partagées, les conflits ne sont donc vérifiés qu'après avoir accédé aux ressources partagées. En cas de conflit, l'opération est annulée. Cela entraîne moins de changements de contexte, mais au prix de plus de conflits possibles.

Verrous de concurrence en Java

Les classes de verrouillage de concurrence intégrées suivantes sont fournies en Java :

  • ReentrantLock : Un mutex réentrant, c'est-à-dire qu'un thread peut acquérir le même verrou plusieurs fois.
  • Semaphore : Un sémaphore de comptage utilisé pour contrôler le nombre maximum de threads simultanés accédant aux ressources partagées.
  • ReadWriteLock : Un verrou en lecture-écriture qui permet à plusieurs threads de lire des ressources partagées en même temps, mais qui permet à un seul thread d'écrire sur des ressources partagées.

Cas pratique

Supposons que nous ayons deux threads accédant à une variable partagée counter en même temps, et que nous voulons nous assurer qu'un seul thread met à jour la valeur de counter code> à la fois. Nous pouvons utiliser ReentrantLock pour y parvenir : counter,并且我们要确保一次只有一个线程更新 counter 的值。我们可以使用 ReentrantLock 来实现:

public class Counter {

    private int counter;
    private ReentrantLock lock = new ReentrantLock();

    public int getCounter() {
        lock.lock();
        try {
            return counter;
        } finally {
            lock.unlock();
        }
    }

    public void incrementCounter() {
        lock.lock();
        try {
            counter++;
        } finally {
            lock.unlock();
        }
    }
}

在这个示例中,getCounter()incrementCounter() 方法都使用 lock 来确保对 counterrrreee

Dans cet exemple, les méthodes getCounter() et incrementCounter() utilisent lock pour garantir que l'accès au counter est thread-safe. 🎜

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