3

いくつかのサイト/ブログで、Singleton コードを次のように見つけました。

public class MySingleton{

    private static MySingleton instance = null;
    .......
    .......
}

他のいくつかでは、Singletonコードを次のように見つけました

public class MySingleton{

    private volatile static MySingleton instance = null;
    .......
    .......
}

MySingletonとして参照する必要がありvolatileますか?何か意味があるのでしょうか?

4

5 に答える 5

1

Java の Volatile キーワードは、この変数の値をキャッシュせず、常にメイン メモリから読み取る Java コンパイラとスレッドへのインジケータとして使用されます。

** 編集 **

private volatile static MySingleton instance = null;

上記のコード スニペットでは、volatile キーワードにより、instance変数が MySingleton インスタンスに初期化されるときに、複数のスレッドが変数を正しく処理できるようになります。

詳細: http://javarevisited.blogspot.com/2011/06/volatile-keyword-java-example-tutorial.html#ixzz2BYyA5Jnm

于 2012-11-07T18:32:52.130 に答える
0

はい、それが変更可能で、マルチスレッド コードに表示される場合。volatileシングルトンがその使用を必要とするかどうかについて特別なことは何もありません。

于 2012-11-07T18:25:24.700 に答える
0

どちらの例でもフィールドはプライベートであるため、どのように公開されるかによって、揮発性である必要がある場合とそうでない場合があります。標準的なイディオムは、代わりに列挙型を使用することです。

于 2012-11-07T18:28:12.700 に答える
0

を使用して物事をシンプルに保ちたいかenum

public enum MySingleton {
    INSTANCE
}

または、それをより複雑にする正当な理由があります

public class MySingleton {
    private MySingleton() { }

    private static MySingleton instance = null;

    public synchronized static MySingleton getInstance() {
         if (instance == null)
             instance = new MySingleton();
         return instance;
    }
}

いずれにせよ、volatile を使用しても役に立ちません。

私見、使用する良いシングルトンパターンはありませんvolatile。必要な場合は、コードを修正または簡素化する必要があります。


AFAIK volatile を使用する唯一のケースは、二重チェックのロック用です

public class MySingleton {
    private MySingleton() { }

    private static volatile MySingleton instance = null;

    public static MySingleton getInstance() {
         if (instance == null)
             synchronzied(MySingleton.class) {
                 if (instance == null)
                     instance = new MySingleton();
             }
         return instance;
    }
}

比較のために、enum上記の例はサンプルの多くを実行します。

http://javarevisited.blogspot.co.uk/2011/06/volatile-keyword-java-example-tutorial.html

http://www.ibm.com/developerworks/java/library/j-dcl/index.html

于 2012-11-07T18:29:15.117 に答える
0

これは、マルチスレッド システムで変更可能なシングルトン フィールドがある場合、特にシングルトンが遅延初期化される場合にのみ必要です。

これは、Java のマルチスレッド システムでシングルトンを遅延初期化する方法に関するより大きな議論の一部です。これに使用されるメカニズムはいくつかありますが、最も一般的なものは次のとおりです。

マルチスレッドシステム用に遅延初期化されたシングルトンを保持する現在受け入れられている方法はenumアプローチですが、それらの 4 つすべてが Java 1.5+ で機能します。

于 2012-11-07T18:31:16.220 に答える