多线程单例模式

Posted 写Bug的渣渣高

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程单例模式相关的知识,希望对你有一定的参考价值。


//延迟加载
//对方法使用synchronized之后,使用多线程debug也是无法进入getInstance方法
class LazySingleton
    private static LazySingleton instance;

//    第一版,在多线程的情况下会有问题,两个获得的实例不一样
//    public LazySingleton getInstance()
//        if (instance==null)
//            instance=new LazySingleton();
//        
//        return instance;
//    

//  给整个方法加上锁,但是对性能影响比较大
//  使用多线程debug
//    public synchronized LazySingleton getInstance()
//        if (instance==null)
//            instance=new LazySingleton();
//        
//        return instance;
//    

//DoubleCheck
//仍有风险,在第一个if和第二个if内部语句
//可能会存在,第一个if判断为真,因为此时instance没有创建好对象
//加一个 volatile 在 static 前
    public LazySingleton getInstance()
        if (instance==null)
            synchronized (LazySingleton.class)
                if (instance==null)
                    instance=new LazySingleton();
// 1.分配内存 2. 初始化对象 3.设置instance指向内存空间  2 3 顺序可能有变化
///2 和 3 重排序
                
            
        
        return instance;
    


// 在创建的时候,就已经初始化了
// 所以是可以在构造器里面判断是否为空
class HungrySingleton
    private static HungrySingleton instance = new HungrySingleton();
    private HungrySingleton()
//        当强制使用反射来构造的时候,也无法构造出另一个类
        if (instance!=null)
            throw new RuntimeException("单例不允许多个实例");
        
    

    public static HungrySingleton getInstance()
        return instance;
    


静态内部类的单例模式:需要JVM知识
class InnerClassSingleton
    private static class InnerClassHolder
        private static InnerClassSingleton instance=new InnerClassSingleton();
    

    private InnerClassSingleton()
        if (InnerClassHolder.instance!=null)
            throw new RuntimeException("单例不允许多个实例");
        
    

    public static InnerClassSingleton getInstance()
        return InnerClassHolder.instance;
    

以上是关于多线程单例模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式-单例模式JAVA实现

设计模式-单例模式JAVA实现

设计模式-单例模式JAVA实现

如何保证单例模式在多线程中的线程安全性

多线程以及同步问题

多线程与单例模式