この件に関する質問がいくつかありますが、問題の意図ではないため、この問題の周りにはほとんどのスカートがあります。静的な揮発性変数を同期する必要がありますか?
私は私のクラスに静的な揮発性を持っている場合:
private static volatile MyObj obj = null;
とI以下の方法で行います。
public MyObj getMyObj() {
if (obj == null) {
obj = new MyObj();// costly initialisation
}
return obj;
}
は、私は一つのスレッドだけがフィールドへの書き込みを保証するために同期させる必要がありますまたは、任意の書き込みがobj == null
条件を評価する他のスレッドにすぐに見えるようになりますか?
別の言い方をすると、volatileは静的変数の書き込みへのアクセスを同期させる必要がありますか?
私はホルダールートに行くことができません:私は開発している全体的なフレームワークにはるかに多くの思考と変更を必要とする私の外部クラスのシングルトンを強制します。私が解決する必要があった問題は、静的インスタンスのアトミックな作成でした。私は静的メソッドを使用し、それを宣言した( 'obj')スタティックfinalで原子の割り当てと並行安全を可能にしました。 –
@atc:いいえ。ホルダールートでは、外部クラスを強制的にシングルトンにすることはありません。ここにあなたが意味することは本当に明確ではありません... –
明快にするために、この 'static volatile'変数はもともとオブジェクトファクトリにあり、実行時にそれを作成するインスタンスに注入しました。これは、前述のstaic var(上記の 'MyObj')の実装の詳細によるものです。ホルダーイディオムを満たすための 'private'コンストラクターの使用は、オブジェクトファクトリの継承の利点を保てないということを意味しました。ここでホルダーイディオムを卑劣にするのではなく、コードベースとの摩擦が最小で、動作することが証明されているので、私はダブルチェック同期ルートに行くと思った。 –