While going through this article I came across the below code which explained safe publication fields.
public class SafeLocalDCLFactory implements Factory {
private volatile Singleton instance;
@Override
public Singleton getInstance() {
Singleton res = instance;
if (res == null) {
synchronized (this) {
res = instance;
if (res == null) {
res = new Singleton();
instance = res;
}
}
}
return res;
}
}
My doubt is why do we need local var res
defined in the getInstance()
? Isn't the volatile
and DCL
enough to guarantee safe publication
? What exactly is the purpose of defining a local var res
here and then comparing it for null
?
EDIT: The article explains the below to justify the need to use local var. But how are we protecting ourselves from returning null?
The introduction of local variable here is a correctness fix, but only partial: there still no happens-before between publishing the Singleton instance, and reading of any of its fields. We are only protecting ourselves from returning "null" instead of Singleton instance
It minimizes the number of reads from the volatile variable instance
. Volatile variable access is more expensive than non-volatile memory access, because usually it involves a memory barrier. By assigning it to a temporary variable, this code reads from the volatile variable only once if it is already initialized, instead of twice (once to check, once to return).
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.