学习设计模式之后,我们会接触到单例模式,单例模式呢有两种实现,饿汉模式和懒汉模式,饿汉模式相对比较简单,就是一开始就把对象创建好,需要了就直接调用就行,那么懒汉模式则是等到要用的时候才去创建对象,这就涉及到重复创建的问题。下面来看单例模式的几种实现
1.不好的解法一:只适用于单线程场景
public class SingletonDemo1 {
private static SingletonDemo1 instance;
private SingletonDemo1(){};
public static SingletonDemo1 getInstance(){
if (instance == null) {
instance = new SingletonDemo1();
}
return instance;
}
}
2.不好的解法二:虽然在多线程环境但效率不高
public class SingletonDemo2 {
private static SingletonDemo2 instance;
private SingletonDemo2(){};
public static synchronized SingletonDemo2 getInstance(){
if (instance == null) {
instance = new SingletonDemo2();
}
return instance;
}
}
3.可行的解法三:加同步锁前后两次判断实例是否已经存在
public class SingletonDemo3 {
private static SingletonDemo3 instance;
private SingletonDemo3(){};
public static SingletonDemo3 getInstance(){
if (instance == null) {
synchronized (SingletonDemo3.class) {
if (instance == null) {
instance = new SingletonDemo3();
}
}
}
return instance;
}
}
SingletonDemo3中只有在instance为null时即没有创建时,需要加锁操作。当instance已经创建出来后,就不需要加锁了,SingletoonDemo3用加锁机制来确保在多线程环境下只创建一个实例,并且用两个if判断来提高效率。