web-dev-qa-db-fra.com

Quelle est l'utilisation de la méthode synchronisée statique en Java?

J'ai une question dans mon esprit, je lis une méthode synchronisée statique verrouillée sur un objet de classe Et une méthode synchronisée se verrouille sur l'instance actuelle d'un objet.

Quelqu'un peut-il m'aider s'il vous plaît sur ce sujet?

35
snehal

En règle générale, les méthodes synchronized servent à protéger l'accès aux ressources accessibles simultanément. Lorsqu'une ressource à accès simultané appartient à chaque instance de votre classe, vous utilisez une méthode d'instance synchronized; lorsque la ressource appartient à toutes les instances (c'est-à-dire lorsqu'elle se trouve dans une variable static), vous utilisez une méthode synchronized static pour y accéder.

Par exemple, vous pouvez créer une méthode de fabrique static qui garde un "registre" de tous les objets produits. Un lieu naturel pour un tel registre serait une collection static. Si votre fabrique est utilisée à partir de plusieurs threads, vous devez créer la méthode fabrique synchronized (ou insérer un bloc synchronized dans la méthode) pour protéger l'accès à la collection static partagée.

Notez que l'utilisation de synchronized sans objet verrou spécifique n'est généralement pas le choix le plus sûr lorsque vous créez une bibliothèque à utiliser dans du code écrit par d'autres. En effet, un code malveillant pourrait se synchroniser sur votre objet ou sur une classe afin d'empêcher l'exécution de vos propres méthodes. Pour protéger votre code contre cela, créez un objet "verrouillé" privé, une instance ou statique, puis synchronisez-le sur cet objet.

58
dasblinkenlight

Au moment de l'exécution, chaque classe chargée a une instance de Class object. C'est l'objet utilisé comme objet de verrouillage partagé par les méthodes static synchronized. (Toute méthode ou tout bloc synchronisé doit être verrouillé sur un objet partagé some.)

Vous pouvez également synchroniser manuellement sur cet objet si vous le souhaitez (que ce soit dans une méthode statique ou non). Ces trois méthodes se comportent de la même manière, n’autorisant qu’un thread à la fois dans le bloc interne:

class Foo {
    static synchronized void methodA() {
        // ...
    }

    static void methodB() {
        synchronized (Foo.class) {
            // ...
        }
    }

    static void methodC() {
        Object lock = Foo.class;
        synchronized (lock) {
            // ...
        }
    }
}

Les méthodes static synchronized ont pour but de permettre à un seul thread à la fois d'utiliser un état mutable stocké dans les variables static d'une classe.

De nos jours, Java possède des fonctionnalités de concurrence plus puissantes, dans Java.util.concurrent et ses sous-packages, mais les constructions Java 1.0 de base telles que les méthodes synchronized sont toujours valides et utilisables.

48
Boann

En termes simples, une méthode static synchronized verrouille la classe au lieu de l’objet, et le verrouille car le mot clé static signifie: "classe au lieu de instance".

Le mot clé synchronized signifie qu'un seul thread peut accéder à la méthode à la fois.
Et static synchronized signifie: 

Un seul thread peut accéder à la classe à la fois.

32
Luis Pena

les méthodes statiques peuvent être synchronisées. Mais vous avez un verrou par classe. lorsque la classe Java est chargée, l'objet de classe Java.lang.class est présent. Le verrouillage de cet objet est nécessaire pour les méthodes synchronisées.static . Ainsi, lorsque vous avez un champ statique qui doit être restreint et accessible en même temps à plusieurs threads, vous pouvez définir ces champs comme privés et créer des sélecteurs ou des sélecteurs synchronisés publics pour accéder à ces champs.

0
Sarala Kumarage