|
|
|
@ -7,7 +7,7 @@
|
|
|
|
|
确保某个类只有一个实例,并提供该实例的获取方法。
|
|
|
|
|
|
|
|
|
|
#### 实现方式
|
|
|
|
|
使用一个私有构造函数、一个私有静态变量,以及一个公共静态方法来实现。懒汉式、饿汉式等简单实现就不多BB咯,这里强调一下双检锁懒汉式实现的坑,以及枚举方式的实现吧,最后再结合spring源码 扩展一下单例bean的实现原理。
|
|
|
|
|
最简单的就是 使用一个私有构造函数、一个私有静态变量,以及一个公共静态方法的方式来实现。懒汉式、饿汉式等简单实现就不多BB咯,这里强调一下双检锁懒汉式实现的坑,以及枚举方式的实现吧,最后再结合spring源码 扩展一下单例bean的实现原理。
|
|
|
|
|
|
|
|
|
|
**1. 双检锁实现的坑**
|
|
|
|
|
```java
|
|
|
|
@ -26,7 +26,7 @@ public class Singleton3 {
|
|
|
|
|
* 3、将instance指向分配的内存地址。
|
|
|
|
|
* 但JVM具有指令重排的特性,实际的执行顺序可能会是1、3、2,导致多线程情况下出问题,
|
|
|
|
|
* 使用volatile修饰instance变量 可以 避免上述的指令重排
|
|
|
|
|
* tips:不太理解的是 第一个线程在执行第2步之前就已经释放了锁?导致其它线程进入synchronized代码块
|
|
|
|
|
* tips:不太理解的是 第一个线程在执行第2步之前就已经释放了锁吗?导致其它线程进入synchronized代码块
|
|
|
|
|
* 执行 instance == null 的判断?
|
|
|
|
|
*/
|
|
|
|
|
private volatile static Singleton3 instance;
|
|
|
|
|