public class Singleton {
private static Singleton singleton;
private Singleton(){
}
public static Singleton getInstance() {
if (null == singleton) {
singleton = new Singleton();
}
return singleton;
}
}
代码一在类创建的同时就并没有建好一个静态的对象供系统使用,并且线程不安全。
public class Singleton {
private static Singleton singleton;
private Singleton(){
}
public static Singleton getsychronizedInstance() {
if (null == singleton) {
synchronized (Singleton.class) {
singleton = new Singleton();
}
}
return singleton;
}
}
代码二在类创建的同时就并没有建好一个静态的对象供系统使用,但是线程安全。
public class Singleton {
private static Singleton singleton = new Singleton();
private Singleton(){
}
public static Singleton getsychronizedInstance() {
return singleton;
}
}
代码三在类创建的同时就已经建好一个静态的对象供系统使用,因此也线程安全。
问题:
饿汉模式和懒汉模式是从线程安全角度来区分?还是从初始化类的时候是否实例化静态对象?来区分的。另外在英文版的设计模式中懒汉模式和饿汉模式对应的英文术语是怎么样的?
@k袁_cn 分析得很清楚。
但是如果要对存在序列化传输的要求的话,这个就有问题了,因为一个已经序列化的对象,反序列化的时候会重新生成一个对象。(违法了单例)
上面的代码变得好复杂,所以最好的单例是采用枚举实现。