Java Concurrency In Practice で、著者は次のように述べています。
- 不変オブジェクトは、任意のメカニズムを介して公開できます
- 不変オブジェクトは、同期を使用して公開していない場合でも、追加の同期なしで任意のスレッドで安全に使用できます。
次のイディオムは、不変オブジェクトを安全に公開できるということですか?
public static List<ImmutableObject> list = new ArrayList<ImmutableObject>();
// thread A invokes this method first
public static void methodA () {
list.add(new ImmutableObject());
}
// thread B invokes this method later
public static ImmutableObject methodB () {
return list.get(0);
}
データ競合はありますか?(つまり、スレッド B は、スレッド A によって追加されたリスト内の不変オブジェクトを認識できない可能性があります)
どうもありがとうございました。
さらに、著者は、リソースが不変である場合、次のコードは安全であると述べました。
@NotThreadSafe
public class UnsafeLazyInitialization {
private static Resource resource;
public static Resource getInstance() {
if (resource == null)
resource = new Resource(); // unsafe publication
return resource;
}
}
セクション16.3 初期化の安全性の保証により、適切に構築された不変オブジェクトは、データ競合を使用して公開された場合でも、公開方法に関係なく、同期せずにスレッド間で安全に共有できます。(これは、が不変で
unsafeLazyInitialization
あれば実際には安全であることを意味します。)Resource
この質問の 2 番目の部分については、別の質問 (ここをクリック) で詳しく説明されています。