单例模式是各场景下常用的一种模式。
安全的double check的实现
注意点
- 构造函数为private修饰,不让外部直接调用创建类
- 两次if判断instance是否为空。第一层是为了判断如果instance存在直接返回,第二层在synchronized内判断是为了解决当一个线程进入,另外排队等待锁的线程在第一个线程释放锁之后重复创建instance对象。
- volatile为了解决禁止指令重排序。instance = new instance 在jvm实际上分为三步,1分配空间,2初始化对象,3分配引用。 在jvm实际执行会存在优化的情况,执行顺序可能有123,132。volatile可以禁止指令重排序。
最后volatile的作用,
- 禁止指令重排序
- 内存可见性
来源:oschina
链接:https://my.oschina.net/u/2250599/blog/3176221