-4

例を考えてみましょう:

class SomeClass{
     private Foo val;

     String getVal(){
           if(val == null){
                synchronized(this){
                      if(val ==null)
                           val = generateFoo();
                }
          }
     }

     Foo generateFoo(){
          //some code
          return new Foo();
     }
}

この場合、揮発性は必要ですか?

4

2 に答える 2

0

The "Double-Checked Locking is Broken" Declarationによると、揮発性にする必要があるようです。

JDK5 以降では、volatile のセマンティクスが拡張されているため、システムは volatile の書き込みを以前の読み取りまたは書き込みに関して並べ替えることができず、volatile の読み取りを後続の読み取りまたは書き込みに関して並べ替えることができません。詳細については、Jeremy Manson のブログのこのエントリを参照してください。

この変更により、ヘルパー フィールドを volatile と宣言することで、Double-Checked Locking イディオムを機能させることができます。これは、JDK4 以前では機能しません。

しかし、私は別の提案をすることができますか?

singletons-the-design-pattern を使用しないでください。シングルトンであることを API で明確にします。クラスのユーザーがそれをシングルトンとして使用できるようにしますが、シングルトンをスコープとして使用したり、Service Locatorで使用したりするなど、その時点で意味のある方法で使用してください。

テストと操作が簡単になり、シングルトンが使用されるたびに子猫を殺す女神が子猫を殺す必要がなくなることを意味します。誰もが満足しています。

于 2015-11-12T13:15:10.340 に答える
0

いいえ必要ありません。AtomicReferenceに行くことができます。

AtomicReference atomicStringReference = 新しい AtomicReference(val);

ここをチェックしてください: https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/package-summary.html

于 2015-11-12T13:29:34.593 に答える