单例模式(Singleton)

2021-07-02  本文已影响0人  橙一万

单例模式注意事项 和 细节说明

单例模式有五种方式:

饿汉式【推荐】

/**
 * 饿汉式单例在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变
 * 所以是线程安全的,可以直接用于多线程而不会出现问题。
 * 【基于JVM的类加载器机制 避免了多线程的同步问题,对象在类装载时就实例化】
 */
public class Hungry {

    private final static Hungry HUNGRY = new Hungry();

    //单例模式要保证构造器私有化,避免有人New对象
    private Hungry() {}

    public static Hungry getInstance() {
        return HUNGRY;
    }
}

懒汉式【不推荐】

/**
 * 线程安全,同步方法,但是效率很低【不推荐使用】
 */
public class LazySingleton {

    private static LazySingleton lazySingleton;

    private LazySingleton() {}

    public static synchronized LazySingleton getInstance() {
        if (lazySingleton == null) {
            lazySingleton = new LazySingleton();
        }
        return lazySingleton;
    }

}

双重检查【推荐】

/**
 * 单例模式(双重检查)
 * 实现懒加载,采用双锁机制,安全且在多线程情况下能保持高性能。
 * volatile:1、保证数据可见性 2、防止指令重排
 */
public class Singleton {

    private static volatile Singleton singleton;

    private Singleton() {}

    public static Singleton getInstance() {
        if (singleton == null) {
            synchronized (Singleton.class) {
                if (singleton == null) {
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }

}

静态内部类【推荐】

/**
 * 单例模式(静态内部类)
 * 懒加载,且利用JVM类加载机制保证了线程安全
 */
public class Singleton {

    private Singleton() {}

    private static class SingletonInstance {
        private final static Singleton2 SINGLETON = new Singleton2();
    }

    public static Singleton getInstance(){
        return SingletonInstance.SINGLETON;
    }

}

枚举【推荐】

public enum Singleton {  
    INSTANCE;  
    public void whateverMethod() {  
    }  
}

单例模式的优点和缺点

上一篇 下一篇

猜你喜欢

热点阅读