都是单例设计模式设计,要说不同的话,饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不在改变,懒汉式如果在创建实例对象时不加上synchronized则会导致对对象的访问不是线程安全的。推荐使用第一种。
但是也有大神说存在这样的问题:
饿汉式在声明实例变量时不加final关键字,并且非正常使用时可能存在问题:
第一个人使用时:
Singleton s = Singleton.getInstance();
s.executeMethod();
s = null; // 非正常使用
当另一个人使用时:
Java code
?
1
2
Singleton s = Singleton.getInstance();
s.executeMethod(); // throw a NullPointException
懒汉式则不存在此问题:
public class Singleton {
private static Singleton instance = new Singleton();
private static Object synObject = new Object();
private Singleton(){}
public static Singleton getInstance() {
if (instance!=null) {
return instance;
}
synchronized(synObject) {
if (instance==null) {
instance = new Singleton();
}
}
return instance;
}
public void executeMethod(...) {
...
}
} |