简单说说单例模式

Posted 是一个肥宅呀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单说说单例模式相关的知识,希望对你有一定的参考价值。

对于大多数场景,懒汉式比较香~

因此 ,就讲述懒汉式单例模式。(因为我也懒~~)


  1. 双重检查


  2. public class Sync {
    public static void main(String[] args) {
    System.out.println("双重检查 ... ");
    Singleton instance = Singleton.getInstance();
    Singleton instance2 = Singleton.getInstance();
    System.out.print("判断instance 是否 等于 instance2 : ");
    System.out.println(instance == instance2);
    System.out.println("instance hash : " + instance.hashCode());
    System.out.println("instance2 hash :" + instance2.hashCode());
    }
    }
    class Singleton {
    // 实例化 Singleton 对象
    private static volatile Singleton instance;
    // 私有化构造器
    private Singleton() {
    }
    // 提供一个静态的公有方法,加入双重检查代码 -> 解决 线程安全问题 ,和 懒加载的问题
    public static synchronized Singleton getInstance() {
    if (instance == null) {
    synchronized (Singleton.class) {
    if (instance == null) {
    instance = new Singleton();
    }
    }
    }
    // while (instance == null) {
    // instance = new Singleton();
    //
    // }
    return instance;
    }
    }
  3. 静态内部类


    public class SingletonTest {
    public static void main(String[] args) {
    /**
    * 1. 利用了类装载的机制 保证初始化实例的时候 ,只有一个线程
    * 2. Singleton_demo 类 被装载时,并不会被实例化,而是在需要实例化的时候
    * 装载SingletonInstance,从而完成 Singleton_demo 的实例化。
    * 类的静态属性 只会在第一次加载类的时候初始化,初始化别的线程无法进入,
    * JVM 确保线程安全性。
    */
    System.out.println("使用静态内部类 完成单例模式 ... ");
    Singleton_demo instance = Singleton_demo.getInstance();
    Singleton_demo instance2 = Singleton_demo.getInstance();
    Singleton_demo instance3 = Singleton_demo.getInstance();
    System.out.print("判断instance 是否等于 instance2 instance2 等于 instance3: ");
    System.out.println(instance == instance2 || instance2 == instance3);
    System.out.println("instance hash : " + instance.hashCode());
    System.out.println("instance2 hash :" + instance2.hashCode());
    System.out.println("instance3 hash :" + instance3.hashCode());
    }
    }
    class Singleton_demo {
    private static volatile Singleton_demo instance;
    private Singleton_demo () {}
    // 静态内部类, 静态属性 Singleton_demo
    public static class SingletonInstance{
    private static final Singleton_demo INSTANCE = new Singleton_demo();
    }
    // 静态的公有方法,直接返回Singleton_demo.INSTANCE
    public static synchronized Singleton_demo getInstance(){
    return SingletonInstance.INSTANCE;
    }
    }


  4. 枚举


    public class SingletonTest02 {
    public static void main(String[] args) {
    Singleton_ instance = Singleton_.INSTANCE;
    Singleton_ instance2 = Singleton_.INSTANCE;
    System.out.println(instance == instance2);
    System.out.println(instance.hashCode());
    System.out.println(instance2.hashCode());
    }
    }
    enum Singleton_ {
    INSTANCE; // 属性
    public void hello() {
    System.out.println(" hello world ! ");
    }
    }


以上是关于简单说说单例模式的主要内容,如果未能解决你的问题,请参考以下文章

面试官:说说对单例模式的理解,最后的枚举实现我居然不知

简单的单例模式其实也不简单

简单的单例模式其实也不简单!

详细说说单例模式

单例模式你会几种写法?(转)

单例模式记录