首页 > 其他 > 详细

# 单例模式

时间:2019-07-17 16:06:39      阅读:64      评论:0      收藏:0      [点我收藏+]

单例模式

方式七种

其中

饿汉 –> 饿汉变种--> 静态内部类

懒汉 线程不安全 --> 懒汉 线程安全–> 双重校验锁

枚举法 网上最推荐的。stackoverflow 上点赞最多的….因为双重校验锁有反射存在的问题

关键单词

instance

enum

synchronized

应该先从饿汉模式开始看, 线程安全。

饿汉 ,

// #饿汉 
public class Singleton{
    private  static Singleton instance=new Singleton();
    private Singleton(){}
    public static Singleton getInstance(){
        return instance;
    }
}

这两种没什么区别,只不过放在了 静态块

//# 饿汉变种
public class Singleton{
    private Singleton instance=null;
    static{
        instance=new Singleton();
    }
    private Singleton(){}
    public static Singleton getInstance(){
        return this.instance;
    }
}

内部静态类

//【推荐】5 静态内部类,前两种是只要singleton 被装载,那么instance就被实例化
// 而这种方法使用调用getInstance 才会被装载,从而实例化instance。
//目的,实例化instance 消耗资源大,希望延迟加载
public class Singleton{
    private static class SingletonHolder{
        private static  final Singleton INSTANCE=new Singleton();
    }

    private Singleton(){}
    public static final Singleton getInstance(){
        return SingletonHolder.INSTANCE;
    }
}

饿汉式

// #懒汉 线程不安全
public class Singleton{

    private static Singleton instance;
    private Singleton(){}

    public static Singleton getInstance{
        if(instance == null){
            instance=new Singleton();
        }
        return instance;
    }
}
// #懒汉 线程 安全  效率低

public class Singleton{
    private static Singleton instance;
    private Singleton(){}
    public static synchronized Singleton getInstance{
        if(instance==null){
            instance=new Singleton();
        }
        return instance;
    }
}
//【推荐】 双重校验锁
public class Singleton{
    private static Singleton instance=null;
    private Singleton(){}
    public static final Singleton getInstance(){
        if(instance==null)
        {
            synchronized(Singleton.class)
            {
                if(Singleton==null)
                    instance=new Singleton();
            }
        }
    }
}

//双重校验锁仍然是有缺点的,极力推荐 enum法
//https://www.jianshu.com/p/1f856daa39c7

枚举

//【推荐】6 、  大神 枚举法 !!!  可以避免 多线程同步问题,还能防止反序列化重新创建对象
public enum Singleton{
    INSTANCE;
    public void whaterverMethod(){
    }
}
//因为JVM会保证enum不能被反射并且构造器方法只执行一次。
//https://837062099.iteye.com/blog/1454934
//枚举的本质 是枚举 对象! ,http://c.biancheng.net/view/1100.html

//https://www.cnblogs.com/alter888/p/9163612.html
//枚举实现原理 , 会生成相关的类,集成

# 单例模式

原文:https://www.cnblogs.com/EsMussSeinHui/p/11201352.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!