java单例设计模式八种写法

chenweimin 9月前 ⋅ 327 阅读
package com.study.factory;
/** 第一种
 * @Description: 饿汉式单例写法
 * @Author: cwm
 * @CreateDate: 2020/12/1 0001 13:17
 */
public class Singleton {
    /**
     *  优点:提供静态变量实例化对象,在类加载的时候进行加载
     *  (jvm保证每个类只会被加载一次,所有对于多线程也是安全的)
     *  缺点:如果该对象没有被使用,会造成内存使用
     *  开发建议使用
     */
    private static Singleton instance =new Singleton();
    //私有构造器
    private Singleton(){}

    //提供静态方法返回对象实例
    public static Singleton getInstance(){
        return instance;
    }
}




package com.study.factory;

/** 第二种
 * @Description: 饿汉式
 * @Author: cwm
 * @CreateDate: 2020/12/1 0001 13:17
 */
public class Singleton {
    /**
     *  次写法和类变量加载方法一样
     */
    private static Singleton instance ;
    static {
        instance=new Singleton();
    }
    //私有构造器
    private Singleton(){}

    //提供静态方法返回对象实例
    public static Singleton getInstance(){
        return instance;
    }
}






package com.study.factory;

/** 第三种
 * @Description: 懒汉式
 * @Author: cwm
 * @CreateDate: 2020/12/1 0001 13:17
 */
public class Singleton {
    private static Singleton instance ;
    //私有构造器
    private Singleton(){}

    //提供静态方法返回对象实例
    //这种写法在多线程访问下是不安全的,不建议使用
    public static Singleton getInstance(){
        if (instance!=null){
            instance=new Singleton();
        }
        return instance;
    }
}



package com.study.factory;

/** 第四种
 * @Description: 懒汉式
 * @Author: cwm
 * @CreateDate: 2020/12/1 0001 13:17
 */
public class Singleton {
    private static Singleton instance ;
    //私有构造器
    private Singleton(){}

    //提供静态方法返回对象实例
    //这种写法虽然多线程是安全了,但是会导致程序效率下降,方法被串行化
    public static synchronized Singleton getInstance(){
        if (instance!=null){
            instance=new Singleton();
        }
        return instance;
    }
}



package com.study.factory;

/** 第五种
 * @Description: 懒汉式
 * @Author: cwm
 * @CreateDate: 2020/12/1 0001 13:17
 */
public class Singleton {
    private static Singleton instance ;
    //私有构造器
    private Singleton(){}

    //提供静态方法返回对象实例
    //这种写法也是多线程下会出现不安全问题
    public static  Singleton getInstance(){
        
        if (instance!=null){
            synchronized (Singleton.class){
                instance=new Singleton();   
            }
        }
        return instance;
    }
}



package com.study.factory;

/** 第六种
 * @Description: 双重检查
 * @Author: cwm
 * @CreateDate: 2020/12/1 0001 13:17
 */
public class Singleton {
    private static volatile Singleton instance ;
    //私有构造器
    private Singleton(){}

    //提供静态方法返回对象实例
    //这种是推荐使用的在多线程下是安全的,效率也还是可以的
    public static  Singleton getInstance(){

        if (instance!=null){
            synchronized (Singleton.class){
                if (instance!=null){
                    instance=new Singleton();   
                }
            }
        }
        return instance;
    }
}


package com.study.factory;

/** 第七种
 * @Description: 静态内部类
 * @Author: cwm
 * @CreateDate: 2020/12/1 0001 13:17
 */
public class Singleton {
    //私有构造器
    private Singleton(){}

    /**
     * 利用静态内部类在类装载是不会进行实例化的机制,
     * 只有当引用到该类或者类属性才去加载,而且jvm也只会加载一次类
     * 建议使用
     */
    static class InnerClass{
        private static final Singleton instance=new Singleton();
    }
    //提供外部获取实例静态方法
    public static Singleton getInstance(){
        return InnerClass.instance;
    }
}


package com.study.factory;

/** 第八种方式
 * @Description: 枚举类
 * @Author: cwm
 * @CreateDate: 2020/12/1 0001 13:17
 */
public class Singleton {
    //私有构造器
    private Singleton(){}

    /**
     * effective java作者推荐,这种写法是最完美的一种写法
     * 根据枚举的特性实现单例
     */
    enum InnerEnum{
        INSTANCE;
        private Singleton singleton;
        private InnerEnum(){
            this.singleton=new Singleton();
        }
    }
    //提供外部获取实例静态方法
    public static Singleton getInstance(){
        return InnerEnum.INSTANCE.singleton;
    }
    
}






全部评论: 0

    我有话说: