ではJava Concurrency In Practice
、不変クラスを作成する方法を説明するために、次の例を示します。
http://www.javaconcurrencyinpractice.com/listings/ThreeStooges.java
このクラスには次private final Set<String> stooges = new HashSet<String>();
のものがあります。コンストラクターで初期化されます。
public ThreeStooges() {
stooges.add("Moe");
stooges.add("Larry");
stooges.add("Curly");
}
と方法があります
public boolean isStooge(String name) {
return stooges.contains(name);
}
名前が三ばか大将の1つであるかどうかを確認します。
しかし、私がこれを行うとき: 、その参照がに設定される前にThreeStooges ts = new ThreeStooges()
、オブジェクトが適切に構築される(つまり、正しく初期化された状態)ことが保証されていますか?stooges
ts
言い換えると、このオブジェクトを公開した場合、一部のスレッドがそれを誤って初期化されたと見なす可能性がありますか(つまり、をstooges
介してアクセスすると空と見なされますisStooge()
)?
私の理解では、不変オブジェクトは適切に構築され、公開されたときに正しく表示されます-(最終的なインスタンス変数を使用するため)。私の理解は正しいですか?はいの場合、このクラスはまだ不変ですか?
編集:私が見たコメントから、コンストラクターが完了する前にオブジェクトが他のスレッドによって見られるとは信じがたいようです。これに関するリンクは次のとおりです。http://jeremymanson.blogspot.in/2008/05/double-checked-locking.html