Lazy Loading Singletons

今天在论坛看见一小段代码,不得不佩服作者( blog)的创新精神。以前在使用Singleton的时候大多采用这样的方式:
java 代码
  1. public class Singleton {
  2. static Singleton instance;
  3. public static synchronized Singleton getInstance() {
  4. if (instance == null)
  5. instance = new Singleton();
  6. return instance;
  7. }
  8. }
但这里的问题是synchronization实际上只在 getInstance()第一次调用的时候需要,这个方法在多线程频繁调用的应用中必然会成为效率的瓶颈。

到了 java 1.5,Bob Lee提到了 Double-Checked Locking (DCL) ,并强调了是infamous DCL;这种做法强调了效率 (但 Bob Lee认为 volatile 不比 synchronized快,另外这种做法会产生更多的代码,所以仍然坚持使用plain old synchronization),并不将整个方法 synchronized,而是只对创建 Singleton进行同步,这样,线程进入 getInstance(),发现 instance 已经创建,就会直接返回instance,而不用在方法外等待。

在这种情况下,Singleton的实现代码一般是这样:
java 代码
  1. static volatile Singleton instance;
  2. public static Singleton getInstance() {
  3. if (instance == null) {
  4. synchronized (Singleton.class) {
  5. if (instance == null)
  6. instance == new Singleton();
  7. }
  8. }
  9. return instance;
  10. }

接下来是 Bob Lee的创新做法:
java 代码
  1. static class SingletonHolder {
  2. static Singleton instance = new Singleton();
  3. }
  4. public static Singleton getInstance() {
  5. return SingletonHolder.instance;
  6. }
JLS将保证 Singleton instance只在第一次调用g etInstance()的时候创建。优雅且快速!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值