单例模式-Singleton Pattern

关于单例模式,我们首先会想到其两种实现方式:饿汉式、懒汉式

饿汉式:

/**
 * 饿汉式单例模式
 */
class Singleton{
    private static final Singleton singleton = new Singleton();
    private Singleton(){}
    public static Singleton getInstance(){
        return singleton;
    }
}

懒汉式(一般实现方式):

 1 /**
 2  *懒汉式单例模式--延迟加载 非线程安全
 3  */
 4 class Single{
 5     private static Single s = null;
 6     private Single(){}
 7     public static Single getInstance(){
 8         if(s == null){
 9             s = new Single();
10         }
11         return s;
12     }
13 }

但是上面的饿汉式单例模式,如果在多线程调用的情况下,第8、9行就容易引发线程安全问题。

为了解决这一问题,我们可以引入双重判断同步代码块解决:

/**
 *懒汉式单例模式--线程安全
 */
class Single{
    private static Single s = null;
    private Single(){}
    public static Single getInstance(){
        if(s == null){
            synchronized(Single.class){
                if(s == null){
                    s = new Single();
                }
            }
        }
        return s;
    }
}

事物总不是完美的,虽然例3解决了懒汉式单例模式的线程安全问题,但因为每一线程访问同步代码块时,都要对Single.class进行锁判断,相应的就牺牲了一部分性能。

原文地址:https://www.cnblogs.com/shindo/p/5313059.html