前言:对学习的一种总结
单例模式的定义
确保某一个类只有一个实例
使用场景
创建一个对象需要消耗的资源过多,如要访问I0和数据库等资源
单例模式的实现方式
1.懒汉模式
2.饿汉模式
3.DCL
4.静态内部类单例模式
以上四种基本耳熟能详,但是我这里想说的一点是DCL失效问题
要解释这点首先要知道原子操作的概念,
所谓原子操作就是一次性将事情做好,没有分步。
解释:DCL失效问题的根源就是new对象的时候不是一个原子操作,而是分了三步
1.给实例分配内存
2.调用构造方法,初始化成员字段
3.将对象指向分配的内存空间(此时对象已经不为空了)
而java编译器又允许处理器乱序执行
这就会导致第一个进来的 有可能是132的执行顺序,因为执行了3,有了实例,所以再进来的就会直接拿走这个实例,因为2没有执行,所以这个实例是空的,因此问题就出现了
后来
在jdk1.5之后,具体化了volatile关键字来解决了这一问题
5.枚举单例,这个是我之前没有接触到的,但是吧,我感觉我不会用吧
public enum SingletonEnum{
INSTANCE;
public void doSomething(){
.....
}
}
先这么多吧,后续还会补充
喵印~~