以下类:
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;
}
}
可以在构建器模式中使用,并且在构建后,它实际上是不可变的,因为每个属性只能设置一次。那是:
Pizza pizza = new Pizza().setIngredients(something).setPrice(somethingelse);
但是,Pizza
它不是线程安全的:不能保证线程 B 看到由线程 A 设置的成分。有一些方法可以修复它:
- 做会员
final
。但是你不能使用构建器模式。 - 同步访问成员。但这似乎是浪费,因为它们只写过一次。
- 制作它们
volatile
。感觉很浪费,就像同步一样。 - 使用
AtomicReference
. - ETC。?
我的问题是,告诉 JVM 在调用某个方法后类成员不会更改的最佳方法是什么?我应该只同步对它的访问,并相信 JVM 会优化锁吗?只是感觉很浪费,因为我知道成员应该表现得像它final
设置后一样。没有更好的解决方案吗?