单例模式 Singleton

一个类只能有一个实例,且该实例是由自己自行创建

特点

  • 单例模式只有一个实例对象
  • 该单例对象必须由单例类自行创建
  • 对外提供一个获取该单例对象的公共方法

饿汉式单例

package com.learn.singleton;

/**
 * 类加载到内存后,就实例一个单例,JVM线程安全
 * 缺点:不管有没有用到,类装载时都会实例化
 */
/**
 * 类加载到内存后,就实例一个单例,JVM线程安全
 * 缺点:不管有没有用到,类装载时都会实例化
 */
public class Singleton {
    private static final Singleton INSTANCE = new Singleton();

    private Singleton() {

    }

    public static Singleton getInstance() {
        return INSTANCE;
    }

    // public static void main(String[] args) {
    //     Singleton instance1 = Singleton.getInstance();
    //     Singleton instance2 = Singleton.getInstance();
    //     System.out.println(instance1 == instance2);
    // }

懒汉式单例

package com.learn.singleton;

/**
 * 使用synchronized解决线程不安全的问题
 * synchronized直接加在方法上会单来性能问题
 */
public class Singleton {
    private static volatile Singleton INSTANCE = null;

    private Singleton() {

    }

    public static Singleton getInstance() {
        if (INSTANCE == null) {
            // 双重检查
            synchronized (Singleton.class) {
                if (INSTANCE == null) {
                    // try {
                    //     Thread.sleep(1);
                    // } catch (InterruptedException e) {
                    //     e.printStackTrace();
                    // }
                    INSTANCE = new Singleton();
                }
            }
        }
        return INSTANCE;
    }

    // public static void main(String[] args) {
    //     for (int i = 0; i < 50; i++) {
    //         new Thread(() -> {
    //             System.out.println(Singleton.getInstance().hashCode());
    //         }).start();
    //     }
    // }

}