0

シングルトンのパターンとスレッドについて質問があります。実装はこんな感じ。

public class Singleton {
    private static final Singleton instance = new Singleton();

    private SomeClass someField;
    // and  another private fields

    private Singleton() {
        someField = new SomeClass(some args);
        // init another private fields
    }

    public Singleton getInstance() {
        return instance;
    }

    public void operation() {
        //some operations
        someField.method();
    }
}

(申し訳ありませんが、実際の例を提供することはできません。) 問題は次のとおりです。メソッド operation() はスレッドセーフですか?

4

3 に答える 3

5

それが安全かどうかはわかりません。何が安全かはわかりませんsomeField.method()

シングルトンが状態を変更する必要がある場合、追加の同期なしではスレッドセーフではないためsomeField、フィールドを作成することを強くお勧めします。それ自体が不変でスレッドセーフである場合、他の同期は必要ありませんが、そうでない場合は必要になります。finalSomeClass

基本的に、シングルトンには「魔法のようにスレッドセーフ」というものはありません。getInstance()これは、複数のスレッドが静的メソッドを介してアクセスできる単一のインスタンスです。クラスがスレッドセーフである場合、それがシングルトンであるかどうかに関係なく、スレッドセーフです。スレッドセーフでない場合は、シングルトンにしても、それを助けるために何もしません。

于 2012-09-08T14:47:21.467 に答える
3

のスレッドセーフは、someField.method();実際に何をしているかによって異なります。複数のスレッド間で共有される状態を変更している場合、スレッドセーフではありません。そうでない場合は、スレッドセーフである可能性があります。しかし、一般に、スレッドセーフであると想定すべきではありません。コードなしではこれ以上は言えません。

于 2012-09-08T14:47:57.533 に答える