Maison >Java >javaDidacticiel >Comment assurer la sécurité des threads dans les méthodes synchronisées des fonctions Java ?

Comment assurer la sécurité des threads dans les méthodes synchronisées des fonctions Java ?

王林
王林original
2024-05-02 14:00:02565parcourir

Les fonctions Java sont thread-safe grâce à des méthodes de synchronisation. Les méthodes synchronisées utilisent le mot-clé synchronisé. Lorsqu'un thread appelle une méthode synchronisée, il doit d'abord acquérir le verrou de l'objet auquel appartient la méthode avant d'exécuter le corps de la méthode. Les autres threads essayant d'appeler la même méthode seront bloqués jusqu'à ce que le premier thread libère le verrou.

Java 函数的同步方法如何实现线程安全?

Comment la méthode de synchronisation des fonctions Java assure-t-elle la sécurité des threads

Dans un environnement multithread, afin de garantir la cohérence et l'intégrité des données, les ressources partagées doivent être synchronisées. Le but de la synchronisation est de garantir qu'un seul thread peut accéder aux ressources partagées en même temps. Java fournit des méthodes de synchronisation pour implémenter cette fonctionnalité.

Méthodes synchronisées

Les méthodes en Java peuvent être déclarées comme méthodes synchronisées à l'aide du mot-clé synchronized. Lorsqu'une méthode synchronisée est appelée, le thread doit d'abord acquérir le verrou de l'objet auquel appartient la méthode avant de pouvoir exécuter le corps de la méthode. Si un autre thread tente d'appeler la même méthode synchronisée, elle sera bloquée jusqu'à ce que le premier thread libère le verrou. synchronized 关键字来声明为同步方法。当一个同步方法被调用时,线程必须先获取该方法所属对象的锁,才能执行方法体。如果另一个线程试图调用同一个同步方法,它将被阻塞,直到第一个线程释放锁。

示例

下面是一个示例,演示如何使用同步方法来保护共享资源:

public class Counter {
    private int count = 0;

    // 同步方法
    public synchronized void increment() {
        count++;
    }
}

increment() 方法被声明为同步方法,这意味着在同一时刻只能有一个线程执行此方法。

实战案例

下面的代码展示了一个实战案例,其中使用了同步方法来保护共享资源:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class ConcurrentCounterDemo {

    public static void main(String[] args) throws InterruptedException {
        // 创建一个共享资源
        Counter counter = new Counter();

        // 创建一个线程池
        ExecutorService executor = Executors.newFixedThreadPool(10);

        // 提交任务到线程池
        for (int i = 0; i < 1000; i++) {
            executor.submit(() -> counter.increment());
        }

        // 等待所有任务完成
        executor.shutdown();
        executor.awaitTermination(1, TimeUnit.MINUTES);

        // 打印计数
        System.out.println("最终计数:" + counter.count);
    }
}

在这个示例中,increment() 方法被用于并发地对共享的 count 变量进行递增操作。如果没有使用同步方法,不同的线程可能会同时修改 count 变量,导致最终计数不正确。通过使用同步方法,我们可以确保同一时刻只有一个线程能够访问 count

🎜Exemple🎜🎜🎜Voici un exemple qui montre comment utiliser des méthodes synchronisées pour protéger les ressources partagées : 🎜rrreee🎜 La méthode increment() est déclarée comme méthode synchronisée, ce qui signifie qu'au en même temps seulement Il y a un thread qui exécute cette méthode. 🎜🎜🎜Cas pratique🎜🎜🎜Le code suivant montre un cas pratique où la méthode de synchronisation est utilisée pour protéger les ressources partagées : 🎜rrreee🎜Dans cet exemple, la méthode increment() est utilisée pour la concurrence Increment la variable count partagée localement. Si la synchronisation n'est pas utilisée, différents threads peuvent modifier la variable count en même temps, ce qui rend le décompte final incorrect. En utilisant la méthode de synchronisation, nous pouvons garantir qu'un seul thread peut accéder à la variable count en même temps, garantissant ainsi la cohérence et l'intégrité des données. 🎜

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