单例模式的几种方式,通用一点来说,分为两种,懒加载和非懒加载
1非懒加载
package com.thread.ch1;
/**
* 不能懒加载
*/
public class SingletonObject1 {
public static final SingletonObject1 instance = new SingletonObject1();
private SingletonObject1() {
}
public SingletonObject1 getInstance() {
return instance;
}
}
2 其他的几个版本都是围绕懒加载来搞的
package com.thread.ch1;
/**
*双重校验 懒加载
*/
public class SingletonObject5 {
private static volatile SingletonObject5 instance;
private SingletonObject5() {
}
public static SingletonObject5 getInstance() {
if (instance == null) {
synchronized (SingletonObject5.class){
if(null == instance)
instance = new SingletonObject5();
}
}
return instance;
}
}
//--------静态内部类的方式
package com.thread.ch1;
/**
*
*/
public class SingletonObject6 {
private SingletonObject6() {
}
private static class InstanceHold {
private static final SingletonObject6 instance = new SingletonObject6();
}
public static SingletonObject6 getInstance() {
return InstanceHold.instance;
}
}
//--------------枚举
package com.thread.ch1;
import sun.dc.pr.PRError;
/**
* 这种是effective java里最推荐的写法
*/
public class SingletonObject7 {
private SingletonObject7() {
}
private enum Single {
INSTANCE;
private final SingletonObject7 instance;
Single() {
this.instance = new SingletonObject7();
}
public SingletonObject7 getInstance() {
return instance;
}
}
public static SingletonObject7 getInstance() {
return Single.INSTANCE.getInstance();
}
}
来源:oschina
链接:https://my.oschina.net/lvzi98/blog/3165125