Maison Java javaDidacticiel Comment les verrous pessimistes et optimistes dans les fonctions Java assurent-ils la sécurité des threads ?

Comment les verrous pessimistes et optimistes dans les fonctions Java assurent-ils la sécurité des threads ?

May 04, 2024 pm 04:51 PM
悲观锁 并发访问 verrouillage optimiste

Deux façons d'assurer la sécurité des threads dans les fonctions Java : verrouillage pessimiste : acquérir le verrou avant d'accéder aux données pour empêcher l'accès simultané par d'autres threads afin de garantir la cohérence des données. (mot-clé synchronisé) Verrouillage optimiste : vérifiez les données à la fin de la transaction et annulez la transaction si les données sont modifiées pour améliorer la concurrence. (Classe atomique dans le package java.util.concurrent.atomic)

Java 函数中的悲观锁与乐观锁如何实现线程安全?

Comment assurer la sécurité des threads entre les verrous pessimistes et les verrous optimistes dans les fonctions Java ?

La sécurité des threads est cruciale pour les environnements multithread, garantissant l'intégrité et la cohérence des données lorsque les données sont accessibles simultanément. En Java, le verrouillage pessimiste et le verrouillage optimiste sont les deux principaux mécanismes permettant d'assurer la sécurité des threads. Ci-dessous, nous explorerons comment ils sont mis en œuvre et fournirons des exemples pratiques.

Verrouillage pessimiste

Le verrouillage pessimiste est basé sur l'hypothèse que les données peuvent être modifiées par d'autres threads à tout moment. Par conséquent, il acquiert le verrou dès qu'il accède aux données, empêchant ainsi les autres threads d'accéder aux données jusqu'à ce que le verrou soit libéré. L’avantage du verrouillage pessimiste est qu’il peut garantir la cohérence des données, mais l’inconvénient est qu’il peut conduire à une concurrence de verrouillage et à une impasse.

Le mot-clé synchronized est une méthode courante pour implémenter le verrouillage pessimiste en Java. Il marque un bloc de code comme section critique et seul le thread qui acquiert le verrou peut entrer dans le bloc de code. synchronized 关键字是 Java 中实现悲观锁的常用方法。它将代码块标记为临界区,只有获取锁的线程才能进入该代码块。

public class Counter {

    private int count;

    public synchronized void increment() {
        count++;
    }

    public synchronized int getCount() {
        return count;
    }
}
Copier après la connexion

乐观锁

乐观锁基于这样的假设:当线程访问数据时,数据不太可能被其他线程修改。它在事务结束时才对数据进行验证,如果数据被修改,则回滚事务。乐观锁的优点是能提高并发性,缺点是如果数据被修改,可能会导致事务失败。

在 Java 中,java.util.concurrent.atomic 包中的原子类可以实现乐观锁。原子类中的操作是原子性的,保证了并发访问数据的正确性。

import java.util.concurrent.atomic.AtomicInteger;

public class Counter {

    private AtomicInteger count = new AtomicInteger(0);

    public void increment() {
        count.incrementAndGet();
    }

    public int getCount() {
        return count.get();
    }
}
Copier après la connexion

实战案例:多线程银行账户

为了演示悲观锁和乐观锁在实际场景中的应用,我们考虑一个多线程银行账户。

  • 悲观锁实现:
public class BankAccount {

    private int balance;

    public synchronized void withdraw(int amount) {
        if (balance >= amount) {
            balance -= amount;
        }
    }

    public synchronized int getBalance() {
        return balance;
    }
}
Copier après la connexion
  • 乐观锁实现:
import java.util.concurrent.atomic.AtomicInteger;

public class BankAccount {

    private AtomicInteger balance = new AtomicInteger(0);

    public void withdraw(int amount) {
        while (true) {
            int currentBalance = balance.get();
            if (currentBalance >= amount) {
                if (balance.compareAndSet(currentBalance, currentBalance - amount)) {
                    break;
                }
            } else {
                break;
            }
        }
    }

    public int getBalance() {
        return balance.get();
    }
}
Copier après la connexion

使用 optimistic 锁,在取款时,它会获得当前余额,然后尝试使用 compareAndSetrrreee

Verrouillage optimiste

Le verrouillage optimiste est basé sur l'hypothèse que lorsqu'un thread accède aux données, il est peu probable que les données soient modifiées par d'autres threads. Il valide uniquement les données à la fin de la transaction et annule la transaction si les données ont été modifiées. L'avantage du verrouillage optimiste est qu'il peut améliorer la concurrence, mais l'inconvénient est que si les données sont modifiées, la transaction peut échouer.

En Java, la classe atomique du package java.util.concurrent.atomic peut implémenter le verrouillage optimiste. Les opérations de la classe atomique sont atomiques, garantissant l'exactitude de l'accès simultané aux données. 🎜rrreee🎜🎜Cas pratique : compte bancaire multithread🎜🎜🎜Pour démontrer l'application du verrouillage pessimiste et du verrouillage optimiste dans des scénarios pratiques, nous considérons un compte bancaire multithread. 🎜
  • 🎜Mise en œuvre du verrouillage pessimiste : 🎜
rrreee
  • 🎜Mise en œuvre du verrouillage optimiste : 🎜
rrreee🎜Utiliser le verrouillage optimiste, lors du retrait , il obtient le solde actuel puis tente de soustraire atomiquement le montant du retrait à l'aide de compareAndSet. Si le solde est insuffisant, l'opération échouera et le thread réessayera. 🎜🎜🎜Choisissez le verrouillage pessimiste ou le verrouillage optimiste🎜🎜🎜Le choix du verrouillage pessimiste ou du verrouillage optimiste dépend du scénario spécifique. S'il existe peu d'accès simultanés aux données ou si la cohérence des données est essentielle, le verrouillage pessimiste est plus approprié. Si les accès simultanés aux données sont fréquents et que la cohérence des données permet un certain degré de compromis, le verrouillage optimiste est plus approprié. 🎜

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

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

Article chaud

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

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)

Comment garantir la sécurité des threads des variables volatiles dans les fonctions Java ? Comment garantir la sécurité des threads des variables volatiles dans les fonctions Java ? May 04, 2024 am 10:15 AM

Comment garantir la sécurité des threads des variables volatiles dans les fonctions Java ?

À quels pièges devons-nous prêter attention lors de la conception de systèmes distribués avec la technologie Golang ? À quels pièges devons-nous prêter attention lors de la conception de systèmes distribués avec la technologie Golang ? May 07, 2024 pm 12:39 PM

À quels pièges devons-nous prêter attention lors de la conception de systèmes distribués avec la technologie Golang ?

Mécanisme de verrouillage et de synchronisation des fonctions C++ en programmation concurrente ? Mécanisme de verrouillage et de synchronisation des fonctions C++ en programmation concurrente ? Apr 27, 2024 am 11:21 AM

Mécanisme de verrouillage et de synchronisation des fonctions C++ en programmation concurrente ?

Un guide pour les tests unitaires des fonctions simultanées Go Un guide pour les tests unitaires des fonctions simultanées Go May 03, 2024 am 10:54 AM

Un guide pour les tests unitaires des fonctions simultanées Go

Comment résoudre le problème des serveurs occupés pour Deepseek Comment résoudre le problème des serveurs occupés pour Deepseek Mar 12, 2025 pm 01:39 PM

Comment résoudre le problème des serveurs occupés pour Deepseek

Comment retourner le pointeur dans Golang ? Comment retourner le pointeur dans Golang ? Apr 23, 2024 pm 02:09 PM

Comment retourner le pointeur dans Golang ?

Comment implémenter des structures de données sans verrouillage dans la programmation simultanée Java ? Comment implémenter des structures de données sans verrouillage dans la programmation simultanée Java ? May 02, 2024 am 10:21 AM

Comment implémenter des structures de données sans verrouillage dans la programmation simultanée Java ?

Comment utiliser les classes atomiques dans la concurrence des fonctions Java et le multithreading ? Comment utiliser les classes atomiques dans la concurrence des fonctions Java et le multithreading ? Apr 28, 2024 pm 04:12 PM

Comment utiliser les classes atomiques dans la concurrence des fonctions Java et le multithreading ?

See all articles