Java面试手写单例模式的三种实现

Java面试手写单例模式的三种实现

自己在Java后台面试的时候遇到了这个代码问题,当时不知道是什么来的,所以经过学习后自己总结了以下单例模式实现方法。

单例模式实现方法:

  • 饿汉式单例:在类初始化时就已经自行实例化了

          public class Singleton {
              //私有静态成员变量
              private static Singleton instance = new Singleton();
              //私有构造方法
              private Singleton(){}
              //公有静态访问方法
              public static Singleton getInstance()
              {
                  return instance;
              }
          }
    

当然可以改为静态方块来执行实例化语句:

            private static Singleton instance = null;
            static{
                instance = new Singleton();
            }
  • 懒汉式单例:在第一次调用实例的时候才实例化

          public class Singleton {
              //私有静态成员变量
              private static Singleton instance = null;
              //私有构造方法
              private Singleton(){}
              //公有静态访问方法,注意加了一个synchronized关键字确保线程安全
              public static synchronized Singleton getInstance()
              {
                  if(instance == null)
                      instance = new Singleton();
                  return instance;
              }
          }
    
  • 双重校验法:(线程安全效率高)

          public class Singleton {
              //私有静态成员变量,加上了volatile关键字确保可见性
              private volatile static Singleton instance = null;
              //私有构造方法
              private Singleton(){}
              //公有静态访问方法
              public static  Singleton getInstance()
              {
                  if(instance == null){
                      //判断instance为null采取获取锁,不用每次获取锁
                      synchronized (Singleton.class){
                          //获取锁这里利用到volatile关键字的可见性,再次判断空
                          if(instance == null)
                              //确保获取锁后线程安全,此时instance真的为空,才去创建实例
                              instance = new Singleton();
                      }
                  }
                  return instance;
              }
          }
    

注意instance用了volatile保证可见性,getInstance方法用了同步块,获得锁是整个类的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值