我知道写入volatile变量会将其从所有cpus的内存中刷新,但是我想知道对volatile变量的读取是否和正常读取一样快?
可volatile变量永远被放置在CPU缓存或者它总是从主存储器中获取?
我正在阅读关于双重检查锁定的信息Effective Java.代码执行以下操作:
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;
}
Run Code Online (Sandbox Code Playgroud)
它说使用result似乎不需要但实际上确保field只在已经初始化的常见情况下只读取一次.
但我不明白这一点.与if(field == null)直接做什么有什么区别?我不明白为什么if (result == null)会有所不同,更不用说如上所述了.
java concurrency multithreading synchronization effective-java