• Java面试题学习-单例模式


    单例模式

    即某个类在整个系统中只能有一个实例对象可被获取和使用的代码模式
    例如:代表JVM运行环境的Runtime类
    要求:

    1. 该类只能由一个实例
      构造器私有化
    2. 它必须自己创建该实例
      含有一个该类的静态变量来存储这个唯一实例
    3. 该类必须仔细向整个系统提供这个实例
      存在对外提供获取这个实例对象的方式:
      1)直接暴露(饿汉式)
      2)用获取静态变量的get方法获取(懒汉式)

    饿汉式

    直接创建对象,不存在线程安全问题

    public class Singleton{
    	//私有化构造器
    	private Singleton(){};
    	//静态变量存储,直接暴露
    	public static final Singleton INSTANCE = new Singleton();
    }
    
    //外部获取方式
    Singleton s = Singleton.INSTANCE;
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    懒汉式

    延迟创建对象

    //适用于单线程
    public class SingletonLan {
    	//私有化构造器
        private SingletonLan(){};
        //静态变量
        private static SingletonLan INSTANCE;
    
        public static SingletonLan getInstance(){
        	//第一次需要时创建
            if(INSTANCE == null){
                INSTANCE = new SingletonLan();
            }
            return INSTANCE;
        }
    }
    
    //适用于多线程
    public class SingletonLan {
       private SingletonLan(){};
       private static SingletonLan INSTANCE;
       public static SingletonLan getInstance(){
           if(INSTANCE == null){
               synchronized (SingletonLan.class){
                   if(INSTANCE == null){
                       try {
                           //多线程下,可能存在多次线程都创建了对象,此次以线程休眠情况举例;所以加锁保证线程安全
                           //线程休眠
                           Thread.sleep(10000);
                       } catch (InterruptedException e) {
                           e.printStackTrace();
                       }
                       INSTANCE = new SingletonLan();
                   }
               }
           }
           return INSTANCE;
       }
    }
    
    
    //外部获取方式
    SingletonLan s1 = SingletonLan.getInstance();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
  • 相关阅读:
    ES6 入门教程 6 正则的扩展 6.1 RegExp 构造函数 & 6.2 字符串的正则方法 & 6.3 u 修饰符
    jvm垃圾收集算法
    JAVA通过COM方式(jeasyopc)接入OPC DA
    【周赛复盘】LeetCode第304场单周赛
    手把手教会将 Windows 窗体桌面应用从.NET Framework迁移到 .NET SDK/.NET 6 格式
    前端css 纯数字或者字母 溢出不换行
    uniapp 阿里图库图标引用
    【项目】在线oj
    gradle快速入门
    Codeforces Round #833 (Div. 2) C. Zero-Sum Prefixes
  • 原文地址:https://blog.csdn.net/lyxuefeng/article/details/126050935