料AboutJavaScriptを有効にして、ご利用ください。不変オブジェクトへの共有参照の可視性を確保する不変(immutable)オブジェクトへの共有参照は、参照が更新されるとただちに複数スレッド間で可視となる、と誤解されることが多い。不変オブジェクトだけ参照するフィールドを含むクラスは、クラス自身が不変であり、それゆえスレッドセーフである、という誤った認識を持つプログラマは少なくない。2006]には、以下のように記述されている問題は、共有オブジェクトが不変であっても、共有オブジェクトにアクセスするために使用される参照もまた共有されており、多くの場合、この参照は可変であるということである。したがって、プログラムを正しく同期するには、共有参照へのアクセスを同期する必要がある。その必要性が認識されず、共有参照へのアクセスが同期されないことが多い。不変オブジェクトへの参照および可変オブジェクトへの参照は、どちらもすべてのスレッドに対して可視にしなくてはならない。不変オブジェクトは、複数のスレッド間で安全に共有することができる。可変オブジェクトの場合、オブジェクトの生成が完了する前に、その参照が可視となる場合がある。初期化が完了していないオブジェクトを公開しない」では、オブジェクトの生成と可視性に特化した問題について記述している。}}getHelper()メソッドは可変のhelperフィールドを公開する。クラスは不変であるため、初期化後に変更することはできない。オブジェクトは常に、その参照が可視となる前に適切に生成される。初期化が完了していないオブジェクトを公開しない」に適合している。他のスレッドが、Fooクラスのhelperフィールドの、最新でない参照を読み取ることはありうる。(メソッドの同期)以下の適合コードでは、Fooクラスのメソッドを同期しており、各スレッドはHelperオブジェクトへの最新でない参照を得ることはない。(Volatile変数)不変のメンバオブジェクトへの参照は、volatile宣言することで可視にすることができる。Helperに変更はない。パッケージ)以下の解決法では、不変オブジェクトHelperへの可変である参照を、アトミックに更新可能なAtomicReferenceでラップしている。}}不変クラスHelperに変更はない。不変オブジェクトへの参照のみを含むクラスは不変であるという仮定は誤りであり、スレッドの安全性に関する深刻な問題を引き起こす可能性がある。Security翻訳元これは以下のページを翻訳したものです。有このページは役に立ちましたか?javascriptを有効にすると、ご回答いただけます。その他のご意見はPCサイトにて入力願います。