一个单一的类,负责创建自己的对象,同时确保系统中只有单个对象被创建。

单例特点

  • 某个类只能有一个实例;(构造器私有)
  • 它必须自行创建这个实例;(自己编写实例化逻辑)
  • 它必须自行向整个系统提供这个实例;(对外提供实例化方法)

    图解:

    image.png

应用场景

什么场景用到?

  • 多线程中的线程池
  • 数据库的连接池
  • 系统环境信息 上下文(ServletContext) ……

面试问题

  • 系统环境信息(System.getProperties())?
  • Spring中怎么保持组件单例的?
  • ServletContext是什么(封装Servlet的信息)?是单例吗?怎么保证?
  • ApplicationContext是什么?是单例吗?怎么保证?
    • ApplicationContext: tomcat:一个应用(部署的一个war包)会有一个应用上下文
    • ApplicationContext: Spring:表示整个IOC容器(怎么保证单例的)。
  • ioc容器中有很多组件(怎么保证单例)
  • 数据库连接池一般怎么创建出来的,怎么保证单实例? …… 、

代码实现

  1. @Data
  2. public class Singleton {
  3. private String name;
  4. private String age;
  5. //volatile修饰 禁止指令重排序 保证内存可见性
  6. private static volatile Singleton singleton /*=new Singleton()*/;//饿汉式 加载类对象即创建
  7. /*构造方法私有化*/
  8. private Singleton(){
  9. }
  10. /*静态方法对外暴露获取单例方法*/
  11. public static Singleton getSingleton(){
  12. //双重加锁校验保证效率和线程安全 此处线程无需强锁等待直接返回
  13. if(singleton == null){
  14. synchronized (Singleton.class){
  15. if(singleton == null){
  16. singleton = new Singleton();
  17. }
  18. }
  19. }
  20. return singleton;
  21. }
  22. }