手写单例模式

/**
 * 单例模式
 * @author gy2018
 *
 */
public class SingletonDemo {
    /**
     * 所谓的单例模式,就是整个程序有且仅有一个实例。
     * 该类负责创建自己的对象 并确保只有一个对象被创建。
     * 在java中,一般常用在工具类的实现或创建对象 需要消耗资源
     *
     * 特点:
     * 类构造器私有
     * 持有自己类型的属性
     * 对外提供获取实例的静态方法
     */
    
    
    /**
     * 饿汉模式
     * 线程安全,比较常用,但是一开始就初始化,容易产生垃圾
     */
//    //创建私有静态的对象
//    private static SingletonDemo singletonDemo = new SingletonDemo();
//    //私有构造器
//    private SingletonDemo(){};
//    //提供一个共有可调用的方法获取实例
//    public static SingletonDemo getSingletonDemo(){
//        return singletonDemo;
//    }
    
    /**
     * 懒汉模式
     * 线程不安全,延迟初始化,严格意义上来讲不是单例模式
     */
//    private static SingletonDemo instance;
//    private SingletonDemo(){};
//    public static SingletonDemo getInstance(){
//        if(instance == null){
//            instance = new SingletonDemo();
//        }
//        return instance;
//    }
    
    /**
     * 双重锁的单例模式,安全且在多线程情况下能保持高性能
     * 进行了两次判断,避免了不要的实例,第二次是为了同步,避免多线程问题。
     * 由于instance = new SingletonDemo()对象的创建在JVM中可能会进行重排序,
     * 在多线程访问下存在风险,使用volatile修饰instance实例变量有效,解决该问题。
     */
    private static SingletonDemo instance;
    private SingletonDemo(){};
    public static SingletonDemo getInstance(){
        if(instance == null){
            synchronized (SingletonDemo.class) {
                if(instance == null){
                    instance = new SingletonDemo();
                }
            }
        }
        return instance;
    }
}

原文地址:https://www.cnblogs.com/gygx110/p/12085174.html