设计模式之单例模式

2018-05-08  本文已影响0人  Rannver

一、单例模式的特点

1.只有一个实例
2.自己给自己创建实例
3.单例类负责给其他所有对象提供这个实例

二、单例模式的几种写法及其特点

1、懒汉式,无法保证线程安全

public class Singleton{

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

2、懒汉式,保证线程安全的方法

public class Singleton{

    private static Singleton instance = null;
    
    private Singleton(){}
    
    public static synchronized Singleton getInstance(){
        if(instance == null){
            instance  = new Singleton();
        }
        return instance;
    }
}

注意:此方法虽然保证了线程安全,但是执行的效率会很低。

3、DCL机制(双重检查锁机制),既保障了线程安全,又保障了执行效率

public class Singleton{

    volatile private static Singleton instance  = null;
    
    private Singleton(){}
    
    public static Singleton getInstance(){
        if(instance == null){
            synchronized(Singleton.class){
                if(instance == null){
                    instance  = new Singleton();
                }
            }
        }
    }
}

注意:偶尔脸黑会发生DCL失效,虽然概率很小,不建议在低于JDK6以下的版本使用,一般能够满足需求。

4、静态内部类的单例模式,保证线程安全和执行效率

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

注意:在第一次调用getInsance方法时才会使instance初始化,能够保证线程安全且保证效率。

上一篇 下一篇

猜你喜欢

热点阅读