【发布时间】:2013-04-12 15:29:03
【问题描述】:
这个问题在某种程度上是这个问题的延续和扩展,我认为完美问题:How does assigning to a local variable help here?
此问题基于Effective Java 的Item 71,建议在volatile 字段访问中引入局部变量以提高性能:
private volatile FieldType field;
FieldType getField() {
FieldType result = field;
if (result == null) { // First check (no locking)
synchronized(this) {
result = field;
if (result == null) // Second check (with locking)
field = result = computeFieldValue();
}
}
return result;
}
所以,我的问题比较常见:
我们是否应该始终通过将值分配给局部变量来访问 volatile 字段? (为了归档最佳性能)。
即一些成语:
我们有一些
volatile字段,就叫它volatileField;-
如果我们想在多线程方法中读取它的值,我们应该:
- 创建具有相同类型的局部变量:
localVolatileVariable - 为易失字段赋值:
localVolatileVariable = volatileField -
从此本地副本中读取值,例如:
if (localVolatileVariable != null) { ... }
- 创建具有相同类型的局部变量:
【问题讨论】:
-
该问题与您链接的问题有何不同?似乎您希望对比那里(和这里)显示的特定代码段的“初始化延迟加载字段”场景更广泛的情况有一个答案。但恐怕答案只能是“取决于”。
-
不同的是,我只想了解:这种优化是否仅适用于
Item 71中描述的特定情况,还是volatile字段读取的常用方法?
标签: java performance concurrency volatile