推荐使用的三种无线程安全问题的单例模式

Posted mars-zyt

tags:

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

1、饿汉式

public class Singleton        
{        
    private static Singleton instance = new Singleton();        
    private Singleton(){           
    }        
    public static Singleton getInstance(){        
             return instance;         
    }        
}

2、懒汉式的双重检查锁定

public class Singleton2 {
    
    private Singleton2() {}
    
    private static volatile Singleton2 instance;
    
    /**
     * 双重检查加锁
     * 
     * @return
     */
    public static Singleton2 getInstance () {
        // 自旋   while(true)
        if(instance == null) {//synchronized作为重量级锁,第一次实例化对象时候使用,读取的时候没必要进行代码锁定
            synchronized (Singleton2.class) {
                if(instance == null) {
                    instance = new Singleton2();  // 指令重排序
                    
                    // 申请一块内存空间   // 1
                    // 在这块空间里实例化对象  // 2
                    // instance的引用指向这块空间地址   // 3
                    //因此使用volatile防止指令重排序
                }
            }
        }
        return instance;
    }
}

3、内部类

public class Singleton{        
    private Singleton(){              
    }        
    private static class SingletonContainer{        
        private static Singleton instance = new Singleton();        
    }        
    public static Singleton getInstance(){        
        return SingletonContainer.instance;        
    }        
}

 

以上是关于推荐使用的三种无线程安全问题的单例模式的主要内容,如果未能解决你的问题,请参考以下文章

finalstatic单例模式与线程安全之间的关系(附单例模式的三种线程安全方式的实现)

怎么实现一个线程安全的单例模式

线程安全的单例模式是否真的安全

Spring 单例 多例 线程安全等问题,想请教大家

C++ 线程安全的单例模式总结

C#单例模式的三种写法