2

以下のコードを参照してください。これはDynamicPropertyFactoryクラスで、ConfigurationManager.classをロックします。私の理解では、ロックはクラスまたはインスタンス自体でのみ機能します。これを理解するには?私の理解として同期ロックを使用すると困惑します

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

なぜ 'class'を最初にロックしていますか? – emotionlessbananas

+2

"ロックはクラスまたはインスタンス自体でのみ機能します"ここでは何を意味するのかは不明です。 –

+0

また、 'synchronized'は何もロックしていません。オブジェクトのモニタ(この場合は 'ConfigurationManager.class')の排他ロックを取得して、同じロックを使用する複数の同期メソッドまたはブロックが同時に実行されるのを防ぎます。 – Kayaman

答えて

1

は、ロックは唯一のクラスまたはインスタンス自体

これは間違っていると、あなたが言いたいことは不明であるに動作します。

nullを指していない参照でもロックを取ることができます。

synchronized (ConfigurationManager.class) 

この行は、classオブジェクトロックが行われていることを意味します。

+0

私の貧しい私の英語のために申し訳ありません。私はDynamicPropertyFactoryクラスが他のクラスと同期して使用する理由を理解できませんが、主にpublic class * DynamicPropertyFactory * {public static * DynamicPropertyFactory * initWithConfigurationSource(AbstractConfiguration config)}のようなコードを書いています。 (this){}} – lawrence

0

この場合、ConfigurationManager.classのロックはグローバルモニタのように機能します。あなたはConfigurationManagerインスタンスに同じロックを置く場合

それは ConfigurationManagerの各インスタンスを扱うすべてのスレッドを、同期します。

+0

DynamicPropertyFactoryクラスで行うと、DynamicPropertyFactoryクラスまたはそのインスタンスのスレッドと同期することはできません – lawrence

+0

そのConfigurationManagerを想像してみてください。クラスは、そのブロックの非同期パフォーマンスを防止するための静的/定数/グローバル・モニターです。 残念ながら私の英語力は貧しい人にもなります。そして私は別の方法を説明することはできません) –

0

This questionは非常に関連性が高い。 synchronized(target)のターゲットがコードブロックの相互排他性を管理するものであることを忘れないでください。ターゲットのモニタがロックされているかどうかに基づいて、常にコードブロックを実行できるスレッドは1つだけですが、ターゲットは常に同じオブジェクトである必要はありません。

コード内のConfigurationManager.classを参照する場所はすべて、同じオブジェクトに解決されるはずなので、ユニバーサルロックとして機能するはずです。しかし、synchronized(this)のようなものを多くのインスタンスと組み合わせると、インスタンスごとにロックが発生し、それらのインスタンス間でそのコードが並列に実行される可能性があります。

本当にグローバルロックが必要な場合は、代わりに.classをロックすることは悪い習慣と考えられ、private static final Object lock = new Object();のようなものを選択する必要があります。

+0

あなたの記事を読むとき何かを理解しているようだ、より多くの時間を読む必要があります。ありがとう。 – lawrence

関連する問題