当一个类的所有属性和方法都是静态的时候,比如说是一个工具类,这个类就可以写成单例模式。
懒汉法、饿汉法都是一种工厂模式,因为不用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;
}
}
网友评论