次のクラス:
class Pizza {
Ingredients ingredients;
Price price;
public setIngredients(Ingredients ing) {
if (ingredients != null) {
throw new IllegalStateException();
}
ingredients = ing;
return this;
}
public setPrice(Price p) {
if (price != null) {
throw new IllegalStateException();
}
price = p;
return this;
}
}
ビルダーパターンで使用できます。各プロパティは1回しか設定できないため、ビルド後は事実上不変です。あれは:
Pizza pizza = new Pizza().setIngredients(something).setPrice(somethingelse);
ただし、Pizza
スレッドセーフではありません。スレッドBがスレッドAによって設定された成分を認識できるという保証はありません。これを修正する方法はいくつかあります。
- メンバーを作成し
final
ます。ただし、ビルダーパターンを使用することはできません。 - メンバーへのアクセスを同期します。しかし、これは無駄のように思えます。なぜなら、それらは一度だけ書かれているからです。
- それらを作成します
volatile
。同期のように無駄を感じます。 - を使用し
AtomicReference
ます。 - 等。?
私の質問は、何らかのメソッドが呼び出された後、クラスメンバーが変更されないことをJVMに伝える最良の方法は何ですか?アクセスを同期して、JVMがロックを最適化することを信頼する必要がありますか?メンバーは設定後のように振る舞うべきだと私は知っているので、それはただ無駄に感じます。より良い解決策はありませんか?final