饿汉模式:加截类的时候就创建对象
class Single{
private Single(){}
private static Single s = new Single();
pubic static Single getInstance(){
return s;
}
}
懒汉模式:调用getInstance()方法时才创建对象
class Single{
private Single(){}
private static Single s = null;
public static Single getInstance(){ //不在这里使用静态锁,因为如果在这里锁,每次获取对象都要判断锁,效率低
if(s==null){ //只有对象不为空的时候才判断锁,提高了效率
synchronized(Single.class){ //以当前类的字节码对象为锁
if(s==null){
s = new Single();
}
}
}
}
}
从上面可以看出,懒汉模式虽然实现了延迟加载,但会导致线程同步的问题。为了实现同步,不得不加同步锁。
如果直接在方法上加synchronized锁,每次调用时都要判断锁,效率比较低。所以采用上面代码的方法实现同
步。但这样使代码繁琐了不少,所以通常情况下还是用饿汉模式创建单例。