DCL的失效:现实与初衷的违背

最近看了Brian Goetz写的一篇有关DCL的文章:Double-checked locking: Clever, but broken。( 2001年发表于JavaWorld上)

这篇文章讲述了DCL设计的初衷,但是因为JVM的不同实现(没有严格遵循JMM规范)导致DCL在实际应用中失效。

 

1. DCL的设计初衷

DCL是为了支持 Lazy initialization而设计的。

我们有多种方式去实现单例模式:

Eager initialization: 饿加载,当类加载器加载类时就初始化类变量。这种方式可以保证初始化的原子性,但降低了程序的启动性能(类加载过程中的初始化阶段对类变量初始化)。

Lazy initialization: 懒加载,当需要使用类变量时才进行初始化。这种方式可以提高程序的启动性能,但需要同步来保证初始化的原子性,无疑带来了同步开销。

DCL的目标是(1)提高程序的启动性能,(2)降低同步开销。

代码示例:

1 class SomeClass { 2 private Resource resource = null; 3 public Resource getResource() { 4 if (resource == null) 5 resource = new Resource(); 6 return resource; 7 } 8 }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyzydy.html