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指令重排
- 分配对象内存
- 调用构造器方法,执行初始化
- 将对象引用赋值给变量。
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; }
|
匿名内部类支持延迟加载, 枚举不能通过 构造,反序列化,克隆等破坏