1.懒汉式
public class SingleInstance1 {
private SingleInstance1() {
}
private static SingleInstance1 instance;
public static SingleInstance1 getInstance() {
if(null == instance) {
instance = new SingleInstance1();
}
return instance;
}
}
该程序缺点是线程不安全
public class SingleInstance1 {
private SingleInstance1() {
}
private static SingleInstance1 instance;
public synchronized static SingleInstance1 getInstance() {
if(null == instance) {
instance = new SingleInstance1();
}
return instance;
}
}
以上程序线程安全,但效率太低
2.饿汉式
public class SingleInstance2 {
private SingleInstance2() {
}
private static SingleInstance2 instance = new SingleInstance2();
public static SingleInstance2 getInstance() {
return instance;
}
}
改程序避免了每次调用getInstance方法时产生的同步开销
3.延长初始化占位类模式
public class SingleInstance3 {
private SingleInstance3() {
}
private static class SingleInstance3Holder {
public static SingleInstance3 instance = new SingleInstance3();
}
public static SingleInstance3 getInstance() {
return SingleInstance3Holder.instance;
}
}
只有当真正使用SingleInstance3Holder 类是才会初始化,并且由于是静态初始化,所以不需要同步
4.DCL
public class SingleInstance4 {
private SingleInstance4() {
}
private static SingleInstance4 instance;
public static SingleInstance4 getInstance() {
if(null == instance) {
synchronized (SingleInstance4.class) {
if(null == instance) {
instance = new SingleInstance4();
}
}
}
return instance;
}
}
该程序的缺点是得到的实例对象可能是一个失效的对象,因为不能保证实例对象的所有成员变量被正确完整的进行了初始化
5.DCl改进
public class SingleInstance5 {
private SingleInstance5() {
}
private static volatile SingleInstance5 instance;
public static SingleInstance5 getInstance() {
if(null == instance) {
synchronized (SingleInstance5.class) {
if(null == instance) {
instance = new SingleInstance5();
}
}
}
return instance;
}
}
加入volatile关键字可以保证该对象的可见性,已使线程得到该对象的最新值
综上,建议使用延迟初始化占位类模式的单利模式