Java 单例模式【懒汉与饿汉】

最近在看点算法的东西,有点收获就记录一下。


单例模式的概念学过面向对象的应该都清楚,这里就不赘述了。需要记录一下的是单例模式的两种写法:懒汉模式饿汉模式
这两者的概念看名字其实有点难理解,但是仔细想想很贴切,我用自己的语言通俗一点解释一下,可能并不能严谨的定义,但是有助于理解——

懒汉模式:即什么时候需要用到这个类的对象,就什么时候去实例化,不用到就永远都不实例化。

饿汉模式:即一开始实例化好,用不用再说,反正先准备好。

看代码来对比区别:

/**
* 懒汉写法(最常见。获取实例相对慢,但是加载类相对快)
*/
public class Singleton {  
    private static Singleton instance;  
     private Singleton (){}   
     public static Singleton getInstance() {  
     if (instance == null) {  
         instance = new Singleton();  
     }  
     return instance;  
     }  
}


/**
* 饿汉写法(比较少见。获取实例相对快,但是加载类相对慢)
*/  
 public class Singleton {  
     private static Singleton instance = new Singleton();  
     private Singleton (){}
     public static Singleton getInstance() {  
    return instance;  
    }  
 }  

上述懒汉模式的写法存在线程不安全的问题,即当多个线程调用这个单例的时候,可能会出现重复创建实例的现象,可以通过以下方式来解决:

  public class Singleton {  
      private static Singleton instance;  
      private Singleton (){}
      public static synchronized Singleton getInstance() {  
      if (instance == null) {  
          instance = new Singleton();  
      }  
      return instance;  
     }  
 }  

多数情况下,不需要这样进行同步处理,因为这样做代码的效率会变低,不需要特殊考虑多线程的情况则不要这样去做。

以上是一点学习心得,感谢阅读!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值