1. DCL 的目的
Double Check Lock 是多线程环境下为提高延迟初始化效率而被广泛使用的一种方式。我们常常会使用延迟初始化,以降低服务启动时间。
/**
* code 1.1
*/
@NotThreadSafe
public class Client {
private LazyInitClass instance ;
public LazyInitClass getInstance() {
if(instance == null)
instance = new LazyInitClass("LazyInitClassFieldName") ;
return instance ;
}
}
上面的代码是典型的延迟初始化的例子。当上面的例子暴露在多线程环境下时,便会出现各种问题。最明显的错误:方法会返回多个 LazyInitClass 对象。
/**
* code 1.2
*/
@NotThreadSafe
public class Client {
private LazyInitClass instance ;
public synchronized LazyInitClass getInstance() {
if(instance == null)
instance = new LazyInitClass("LazyInitClassFieldName") ;
return instance ;
}
}
<