您的当前位置:首页正文

单身狗模式

来源:要发发知识网

当一个类的所有属性和方法都是静态的时候,比如说是一个工具类,这个类就可以写成单例模式。
懒汉法、饿汉法都是一种工厂模式,因为不用new而创建了对象。

饿汉法:私有属性、构造,并且立即new出对象对属性进行初始化。

  • 所有的事情都在一开始完成,所以在获得对象的时候,不必像懒汉那样讨论是不是第一次创建。因此,如果没有高效的判断策略,懒汉模式会因为每次都判断是不是首次创建,而效率低下。
public class Singleton {   
    private static Singleton = new Singleton();
    private Singleton() {}
    public static getSignleton(){
        return singleton;
    }
}

懒汉法

  • 私有属性、构造,在静态方法里面对属性进行初始化。
  • 考虑线程安全:synchronize(类锁)+ volatile
    • 把所有线程安全的关键字都用上了:一个保护方法,一个保护变量。
    • 用不了对象锁,因为对象还没有被创建出来
  • 性能优化:每次调用getSingleton()方法,都必须在synchronized这里进行排队,而真正遇到需要new的情况是非常少的。在加锁前多进行一次null检查就可以减少绝大多数的加锁操作,执行效率提高的目的也就达到了(所以第一个null检查是为了避开加锁操作,第二个null检查是为了判断是不是第一次创建对象)。
public class Singleton {
    private static volatile Singleton singleton = null;
 
    private Singleton(){}
 
    public static Singleton getSingleton(){
        if(singleton == null){  // 避免不必要的加锁操作
            synchronized (Singleton.class){
                if(singleton == null){  // 判断是不是第一次创建对象
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }    
}