Java单例模式

单例设计模式

  • 解决问题:可以保证一个类在对象中唯一性
  • 必须对于多个实例使用同一个配置信息对象时,就需要保证该对象唯一性
  • 如何保证对象唯一性?

    • 不允许其他程序使用new创建对象
    • 在该类创建一个本地实例
    • 对外提供一个方法让其他程序可以获取该对象
  • 步骤:

    • 私有化该类构造函数
    • 通过new在本类中创建一个本类对象
    • 定义一个公有的方法,将创建的对象返回

饿汉式

  • 代码展示

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    //饿汉式
    public class Single {
    //类加载进来时,对象就已经生成了
    private static Single s = new Single();
    private Single(){}
    public static Single getInstance(){
    return s;
    }
    }
    public class Demo{
    `public static void main(String[] args){
    Single s1 = Single.getInstance();
    Single s2 = Single.getInstance();
    System.out.println(s1 == s2);
    }
    }
  • 工作中常常使用的一种单例模式,安全性好

    懒汉式

  • 代码展示

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // 懒汉式
    public class Single2 {
    //类加载时没有对象生成,只有调用了getInstance方法后才会创建对象
    //延迟加载程序
    private static Single2 s = null;
    private Single2(){}
    public static Single2 getInstance(){
    if(s==null)
    s = new Single2();
    return s;
    }
    }
  • 常见于面试中,涉及知识点较多

    内存图示(饿汉式为例)

  • main进栈,s1对象生成,方法区,single构造函数进入,静态区,single s getInstance进入,堆中开辟一块空间,赋予0x0045地址,静态区中s指向堆中地址。get方法进栈,s1地址指向0x0045,get出栈。