Joo*_*kka 1 java volatile synchronized thread-safety memory-visibility
以下课程:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
可以在构建器模式中使用,在构建之后,它实际上是不可变的,因为每个属性只能设置一次.那是:
Pizza pizza = new Pizza().setIngredients(something).setPrice(somethingelse);
Run Code Online (Sandbox Code Playgroud)
但是,Pizza它不是线程安全的:不能保证线程B看到线程A设置的成分.有一些方法可以解决它:
final.但是你不能使用构建器模式.volatile.像同步一样感觉浪费.AtomicReference.我的问题是,告诉JVM一个类成员在调用某个方法后不会改变的最佳方法是什么?我应该只是同步对它的访问,并相信JVM会优化锁定吗?它只是感觉浪费,因为我知道成员应该final在它设置之后表现得像它一样.有没有更好的解决方案?
构建器模式通常意味着构建器是一个单独的对象.在这种情况下,您可以创建正在构建的对象的字段final,并在构建器对象调用的构造函数中初始化它们:
Pizza pizza =
new PizzaBuilder()
.setIngredients(something)
.setPrice(somethingelse)
.build();
Run Code Online (Sandbox Code Playgroud)
或者,您可以确保安全发布Pizza对象.请注意,安全发布惯用法应用于包含对要发布的对象的引用的字段,而不是该对象本身的字段.例如,if pizza是某个对象的字段,您可以创建它volatile或同步对它的访问 - 它将确保安全发布Pizza分配给该字段的对象.
| 归档时间: |
|
| 查看次数: |
310 次 |
| 最近记录: |