其他分享
首页 > 其他分享> > 单例模式6种实现及利弊分析

单例模式6种实现及利弊分析

作者:互联网

目录

单例模式6种实现及利弊分析

单例模式三要素

1.饿汉式

public class Singleton {
    private static Singleton singleton = new Singleton();

    private Singleton(){};
    
    public static Singleton getSingleton(){
        return singleton;
    }
}

优点:线程安全,在类加载完成时就完成了初始化,调用效率高

缺点:类加载较慢,无法达到懒加载的效果

2.懒汉式(非线程安全)

public class Singleton{
	private static Singleton singleton;
    
    private Singleton(){};
    
    public static Singleton getSingleton(){
		if(singleton == null){
            singleton = new Singleton();
        }
    	return singleton;
    }
}

优点:节约资源,实现懒加载

缺点:非线程安全,获取对象需要实例化,调用效率低

3.懒汉式(synchronized)

public class Singleton{
	private static Singleton singleton;
    
    private Singleton(){};
    
    //	1.synchronized块 实现线程安全
    /*public static Singleton getSingleton(){
        synchronized(Singleton.class){
        	if(singleton == null){
                singleton = new Singleton();
            }
            return singleton;
        }       
    }
    */
    
    //	2.synchronized方法 实现线程安全
    public static synchronized Singleton getSingleton(){
		if(singleton == null){
            singleton = new Singleton();
        }
    	return singleton;
    }
}

优点:线程安全,实现懒加载

缺点:获取对象需要实例化,调用效率低

4.懒汉式(静态内部类)

public class Singleton{
    private static class Holder{
        private static Singleton singleton = new Singleton();
    }
    
	private Singleton(){};
    
    public static Singleton getSingleton(){
        return Holder.singleton;
    }
}

优点:线程安全,实现懒加载

缺点:暂无

5.懒汉式(双重锁DCL)

public class Singleton{
    //volatile禁止指令重排序,避免DCL失效问题
    private static volatile Singleton singleton;
    
    private Singleton(){};
    
    public static Singleton getSingleton(){
        //避免重复的同步
        if(singleton == null){
            //如果未实例化,才进行加锁
            synchronized(Singleton.class){
                if(singleton == null){
					singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
}

优点:线程安全,实现懒加载

缺点:暂无

6.懒汉式(ThreadLocal)

public class Singleton {
    private static volatile Singleton singleton;
    private static ThreadLocal<Singleton> threadLocal = new ThreadLocal<>();

    private Singleton(){};

    public static void createSingleton(){
        synchronized (Singleton.class){
            if (singleton == null){
                singleton = new Singleton();
            }
        }
        threadLocal.set(singleton);
    }

    public static Singleton getSingleton(){
        if(threadLocal.get() == null){
            createSingleton();
        }
        return singleton;
    }
}

优点:也相当于实现了双重检查,线程安全

缺点:效率不及传统双重检查

标签:Singleton,singleton,模式,class,利弊,static,private,单例,public
来源: https://www.cnblogs.com/Zzzkis/p/singleton.html