博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
单例设计模式
阅读量:4093 次
发布时间:2019-05-25

本文共 2550 字,大约阅读时间需要 8 分钟。

  • 这两天看微信公众号的时候看到一个面试问题,”spring中是如何使用单例设计模式的”,赶紧回顾一波单例设计模式
  • 开门见山,什么是单例模式呢?就是整个系统中只出现一个类的实例
  • 该如何实现呢
    • 一共有好几种方式
    • 懒汉 线程不安全
public class Singleton {    private static Singleton instancce;    private Singleton(){}    public static Singleton getInstance(){        if(instancce == null){            instancce = new Singleton6();        }           return instancce;    }}
  • 懒汉 线程安全 方法加上synchronized
public synchronized static Singleton getInstancce(){        if(instancce == null){            instancce = new Singleton6();        }        return instancce;    }
  • 双重检查锁
public class Singleton {   private static Singleton singleton;   private Singleton(){}   private static Singleton getInstance(){       if(singleton == null) {           synchronized (Singleton.class) {               if(singleton == null) {                   singleton = new Singleton();               }           }       }       return singleton;   }}
  • 这段代码看起来很完美,很可惜,它是有问题。主要在于instance = new Singleton()这句,这并非是一个原子操作
    ,事实上在 JVM 中这句话大概做了下面 3 件事情
  • 给instance 分配内存
  • 构造函数初始化成员变量
  • 为实例对象分配内存空间
public class Singleton {   private volatile static Singleton singleton;   private Singleton(){}   private static Singleton getInstance(){       if(singleton == null) {           synchronized (Singleton.class) {               if(singleton == null) {                   singleton = new Singleton();               }           }       }       return singleton;   }}
  • 加上volatile关键字 作用禁止指令重排序
  • 饿汉式
    • 在类已加载时就会被实例 如实例前需要配置文件赋值则不行
public class Singleton {    private static final Singleton instance = new Singleton5();    private Singleton(){}    public static Singleton getInstance(){        return instance;    }}
  • 静态内部类
    • 采用的是jvm保证,由于 SingletonHolder 是私有的,除了 getInstance() 之外没有办法访问它,因此它是懒汉式的;同时读取实例的时候不会进行同步,没有性能缺陷;也不依赖 JDK 版本
public class Singleton {    private static class SingletonHolder{        private static Singleton INSTANCE  = new Singleton3();    }    private Singleton(){}    public static Singleton getInstance(){        return SingletonHolder.INSTANCE;    }}
  • 枚举
    • 我们可以通过Singleton.INSTANCE来访问实例,这比调用getInstance()方法简单多了。创建枚举默认就是线程安全的,所以不需要担心double checked locking,而且还能防止反序列化导致重新创建新的对象。但是还是很少看到有人这样写,可能是因为不太熟悉吧
public enum  Singleton {    INSTANCE;}
  • 容器单例 了解一下
public class Singleton4 {    private static Map
objMap = new HashMap
(); private Singleton4(){} public void registerService(String key,Object instance){ if(!objMap.containsKey(key)){ objMap.put(key,instance); } } public static Object getInstance(String key){ return objMap.get(key); }}
  • 参考博客

转载地址:http://lqiii.baihongyu.com/

你可能感兴趣的文章
程序员之神
查看>>
4 岁小女孩给 Linux 内核贡献提交
查看>>
推荐几个私藏很久的技术公众号给大家
查看>>
20 个 2020 年软件开发趋势预测
查看>>
王垠受邀面试阿里 P9,被 P10 面跪后网上怒发文,惨打 325 的 P10 赵海平回应了!...
查看>>
Python 趣味打怪:147 段简单代码助你从入门到大师
查看>>
卧槽!小姐姐用动画图解 Git 命令,这也太秀了吧?!
查看>>
厉害了!Python 编辑器界的神器 Jupyter ,推出官方可视化 Debug 工具!
查看>>
卧槽!Java 虚拟机竟然还有这些性能调优技巧...
查看>>
JavaScript 诞生的这 20 年来,都发生了什么...
查看>>
听说玩这些游戏能提升编程能力?
查看>>
7 年工作经验,面试官竟然还让我写算法题???
查看>>
被 Zoom 逼疯的歪果仁,造出了视频会议机器人,同事已笑疯丨开源
查看>>
上古语言从入门到精通:COBOL 教程登上 GitHub 热榜
查看>>
再见,Eclipse...
查看>>
超全汇总!B 站上有哪些值得学习的 AI 课程...
查看>>
如果你还不了解 RTC,那我强烈建议你看看这个!
查看>>
神器面世:让你快速在 iOS 设备上安装 Windows、Linux 等操作系统!
查看>>
沙雕程序员在无聊的时候,都搞出了哪些好玩的小玩意...
查看>>
太赞了!GitHub 标星 2.4k+,《可解释机器学习》中文版正式开放!
查看>>