2

Siehe unten Code, dies verwirrt mich, in der Klasse DynamicPropertyFactory, es blockiert ConfigurationManager.class, wie ich verstehe, funktioniert die Sperre nur in der Klasse oder der Instanz selbst. Wie versteht man das?verwirrt bei Verwendung synchronisierter Sperre

public class *DynamicPropertyFactory*{ 
     public static *DynamicPropertyFactory* initWithConfigurationSource(AbstractConfiguration config) { 
      synchronized (**ConfigurationManager.class**) { 
       if (config == null) { 
        throw new NullPointerException("config is null"); 
       } 
       if (ConfigurationManager.isConfigurationInstalled() && config != ConfigurationManager.instance) { 
        throw new IllegalStateException("ConfigurationManager is already initialized with configuration " 
          + ConfigurationManager.getConfigInstance()); 
       } 
       if (config instanceof DynamicPropertySupport) { 
        return initWithConfigurationSource((DynamicPropertySupport) config); 
       } 
       return initWithConfigurationSource(new ConfigurationBackedDynamicPropertySupportImpl(config)); 
      } 
     } 
    } 
+0

Warum sperren Sie 'Klasse' an erster Stelle? – emotionlessbananas

+2

"Das Schloss funktioniert nur in der Klasse oder der Instanz selbst" Es ist unklar, was Sie hier meinen. –

+0

Beachten Sie auch, dass "synchronisiert" nichts "sperrt". Es * erwirbt * eine exklusive Sperre für den Monitor eines Objekts (in diesem Fall 'ConfigurationManager.class'), die verhindert, dass mehrere synchronisierte Methoden oder Blöcke, die dieselbe Sperre verwenden, gleichzeitig ausgeführt werden. – Kayaman

Antwort

1

wie mein Verständnis, funktioniert die Sperre nur in der Klasse oder der Instanz selbst

Das ist falsch und nicht klar, was Sie sagen wollen.

Sperre kann auf jede Referenz genommen werden, die nicht auf null zeigt.

synchronized (ConfigurationManager.class) 

Diese Zeile bedeutet, dass unter class die Objektverriegelung ausgeführt wird.

+0

Entschuldigung für mein schlechtes Englisch. Ich verstehe nicht, warum DynamicPropertyFactory-Klasse verwendet mit einer anderen Klasse synchronisiert, vor allem schreibe ich Code wie öffentliche Klasse * DynamicPropertyFactory * {öffentliche statische * DynamicPropertyFactory * initWithConfigurationSource (AbstractConfiguration config) { synchronisiert (this) {}} – lawrence

0

In diesem Fall funktioniert die Sperre auf ConfigurationManager.class funktioniert wie globaler Monitor.

Wenn Sie die gleiche Sperre setzen, um ConfigurationManagerInstanz dann es werden alle Threads synchronisieren, die jede Instanz ConfigurationManager beschäftigen.

+0

Aber was soll das? tun mit der Klasse DynamicPropertyFactory, kann nicht mit Threads auf DynamicPropertyFactory-Klasse oder seine Instanz synchronisiert werden – lawrence

+0

Stellen Sie sich das ConfigurationManager.Die Klasse ist statisch/konstant/global, um jegliche asynchrone Leistung in ihrem Block zu verhindern. Leider sind meine Englischkenntnisse auch zu schlecht. Und ich kann nicht einen anderen Weg erklären) –

0

This question ist sehr relevant; Denken Sie daran, dass das Ziel Ihrer die Sache ist, die die gegenseitige Exklusivität des Codeblocks verwaltet. Nur ein Thread kann den Codeblock zu einem bestimmten Zeitpunkt ausführen, abhängig davon, ob der Monitor des Ziels gesperrt ist, aber das Ziel nicht notwendigerweise immer das gleiche Objekt ist.

Überall, wo Sie auf ConfigurationManager.class10 in Ihrem Code beziehen, sollte auf das gleiche Objekt aufgelöst werden, so dass es als Universalsperre funktionieren sollte. Wenn Sie jedoch so etwas wie synchronized(this) in Kombination mit vielen Instanzen verwenden, würde dies zu einer Sperre pro Instanz führen und die Möglichkeit, dass dieser Code parallel in diesen Instanzen ausgeführt wird, niemals parallel in einer einzelnen Instanz.

Das Sperren auf .class wird als schlechte Methode betrachtet und Sie sollten sich stattdessen für etwas wie private static final Object lock = new Object(); entscheiden, wenn Sie wirklich eine globale Sperre benötigen.

+0

Scheint etwas zu verstehen, wenn Sie Ihren Beitrag lesen, sollte mehr mal lesen. Vielen Dank. – lawrence