慎用延时初始化(71)

延迟初始化是延时到需要域的值的时候才进行初始化

  • 如果不需要,永远不初始化
  • 既适用于静态域、也适用于实例域
  • 延时初始化是一种优化
    • 除非绝对必要,请尽量不要使用
    • 降低了初始化开销、增加了访问该域被初始化的开销

多个线程时,延时初始化需要技巧:

  • 此时,采用某种形式的同步很重要,否则可能会导致严重后果

大多数情况下,正常初始化优于延时初始化

  • 正常:

f7d3efe432745c40f7de7fe0ae237b7f28e.jpg

  • 延时:
    • 需要使用某种同步

8d7f1ef7fb8a8c0cc6780ae8e4abb44e1ab.jpg

  • 以上两种形式用在静态域,用法相同

静态域延时初始化,lazy initialtion holder class 的模式

  • 让人联想到单例模式的代码
  • getFiled 第一次被调用的时候,触发静态域加载
    • 而且现代 jvm 会在初始化后修补代码,后续访问会直接得到值

f3b2c5dac277da7f329386a85c65bdcc5da.jpg

  • 出于性能原因延时初始化,采用双重检查模式
    • 实例域采用,静态域采用lazy initialtion holder class 的模式

bac0eb7348e382895955843ddd91d94930c.jpg

  • 如果可以重复初始化,考虑单重检查模式

4c52931382fdb7e84d24455c53b7c80a5b5.jpg

  • 涉及基本类型时, 用0 判断,而不是 null

总结:

  • 大多数情况下正常初始化就OK
  • 如果为了性能,或打破有害初始化循环
  • 对于实例域,采用双重检查
  • 静态域:
    • 采用lazy initialtion holder class 的模式
    • 可重复初始化的,可考虑单重检查

 

转载于:https://my.oschina.net/u/3847203/blog/2989413

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值