单例模式

1. 饿汉

2 .懒汉

双重检验: volatitle

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class SingletionObject{

priviate volatitle SingletionObject signletionObject;
public getSignletionObject(){
if(signletionObject==null){
synchronized(SingletionObject.class){
if(signletionObject==null){
signletionObject= new SingletionObject();
}
}
}
return signletionObject;
}
}

为什么用volatitle:

new 对象分三步操作: 2,3指令重排

  1. 分配对象内存
  2. 调用构造器方法,执行初始化
  3. 将对象引用赋值给变量。

3. 枚举或者静态内部类

1
2
3
4
5
6
7
8
9
10
11
12

public class StaticSingleton {

private StaticSingleton() { /*……*/}

private static class SingletonHolder {
private static StaticSingleton instance = new StaticSingleton();
}

public static StaticSingleton getInstance() {
return SingletonHolder.instance;
}

匿名内部类支持延迟加载, 枚举不能通过 构造,反序列化,克隆等破坏