2016-12-19 2 views
0

ich den Netflix-Code zu sehen, die in der Klasse DynamicPropertyFactory, gibt es eine Methode, wiedurch synchronisierte Nutzung verwirrt

public static DynamicPropertyFactory getInstance() { 
    if (config == null) { 
     synchronized (ConfigurationManager.class) { 
      if (config == null) { 
       AbstractConfiguration configFromManager = ConfigurationManager.getConfigInstance(); 
       if (configFromManager != null) { 
        initWithConfigurationSource(configFromManager); 
        initializedWithDefaultConfig = !ConfigurationManager.isConfigurationInstalled(); 
        logger.info("DynamicPropertyFactory is initialized with configuration sources: " + configFromManager); 
       } 
      } 
     } 
    } 
    return instance; 
} 

ich auf dieser Methode bin verwirrt, warum synchronized (ConfigurationManager.class) verwenden, synchronisiert Schlüsselwort auf einer anderen Klasse ConfigurationManager.class verwendet wurde. Aus meiner Sicht wird synchronisiert in seiner aktuellen Klasse verwendet. Also, kann jemand helfen, das einfach zu erklären?

+0

Ja, das Klassenstufe Synchronisation ist. Beachten Sie, dass die DynamicPropertyFactory eine Klassenmethode ist. – Henry

+0

, aber es ist synchronisiert (ConfigurationManager.class) nicht synchronisiert (DynamicPropertyFactory.class), also .. – lawrence

+0

Sie möchten nur einmal die Konfiguration der Klassenvariablen initialisieren. Während der Initialisierung Klassenmethode getConfigInstance in der Klasse ConfigurationManager wird aufgerufen, das ist der Grund sie Klassenebene Synchronisation (Klassensperre) verwenden – Henry

Antwort

0

Wahrscheinlich weil sie erwarten, dass andere Klassen in einem anderen Thread auf ConfigurationManager zugreifen.

+0

Ich denke, wenn ein Thread Methode getInstance aufruft, und andere Thread, die Zugriff auf ConfigurationManager die Klasse oder Instanz-Methode wird blockiert werden , Recht? – lawrence

+0

ja. Obwohl dieser Stil mir seltsam erscheint. ist das aus Neugier? oder versuchst du etwas zu lösen? –

+0

Nein, ich sehe das nur von Netflix Projekt – lawrence

0

Der obige Code wurde nicht gut geschrieben.

DynamicPropertyFactory sollte nicht über die Einbeziehung synchronized prüfen, um ConfigurationManager Instanz zu erhalten.

Im Idealfall ConfigurationManager.getConfigInstance() sollte ordnungsgemäße Prüfungen und synchronized (ConfigurationManager.class) Prüfung sollte auf ConfigurationManager verschoben werden.

Anrufer von ConfigurationManager sollten einfach Instanz mit getConfigInstance() API ohne synchronized überprüfen.

Hier finden Sie aktuelle unten SE Frage Singleton in der rechten Weise Objekt zu implementieren:

Why is volatile used in this example of double checked locking