用枚举创建单例没有;没有自创、都是把人家的重点扣下来记录(侵权请联系我、马上删除- -!)
synchronized版完美程序如下:参考自:https://www.cnblogs.com/dongyu666/p/6971783.html
public class Single {
private static volatile Single instance;
//单例所以构造方法私有
private Single() {}
public static Single getInstance() {
//除去99.9%的情况
if (instance == null) {
synchronized (Single.class) {
/*此处可能出现这种情况:俩线程A、B。A是去使用实例的、B是创建实例的。
【创建实例的过程,1.分配内存 2.在堆内写好对象 3.栈指向堆地址】
默认情况下指令重排、当”指令重排”情况下,可能1->2->3,也可能1->3->2。当1->3->2时,B走完3但是没完成2;A读取的对象并使用、这时候对象仍未创建完成、发生错误。
所以只要指令重排进制就ok了,添加volatile关键字修饰。volatile其中一个作用是指令禁止重排*/
if (instance == null) {
instance = new Single();
}
}
}
return instance;
}
}
也可以一开始就创建
public class Single{
private static volatile Single instance = new Single();
//单例所以构造方法私有
private Single() {}
public static Single getInstance() {
return instance;
}
}
effective java提到的
public class SingleObj {
private static class SingletonHolder {
private static final SingleObj INSTANCE = new SingleObj();
}
private SingleObj (){
System.out.println("create single obj");
}
public static final SingleObj getInstance() {
return SingletonHolder.INSTANCE;
}
}