延迟初始化是延时到需要域的值的时候才进行初始化
- 如果不需要,永远不初始化
- 既适用于静态域、也适用于实例域
- 延时初始化是一种优化
- 除非绝对必要,请尽量不要使用
- 降低了初始化开销、增加了访问该域被初始化的开销
多个线程时,延时初始化需要技巧:
- 此时,采用某种形式的同步很重要,否则可能会导致严重后果
大多数情况下,正常初始化优于延时初始化
- 正常:
- 延时:
- 需要使用某种同步
- 以上两种形式用在静态域,用法相同
静态域延时初始化,lazy initialtion holder class 的模式
- 让人联想到单例模式的代码
- getFiled 第一次被调用的时候,触发静态域加载
- 而且现代 jvm 会在初始化后修补代码,后续访问会直接得到值
- 出于性能原因延时初始化,采用双重检查模式:
- 实例域采用,静态域采用lazy initialtion holder class 的模式
- 如果可以重复初始化,考虑单重检查模式
- 涉及基本类型时, 用0 判断,而不是 null
总结:
- 大多数情况下正常初始化就OK
- 如果为了性能,或打破有害初始化循环
- 对于实例域,采用双重检查
- 静态域:
- 采用lazy initialtion holder class 的模式
- 可重复初始化的,可考虑单重检查