auto commit

This commit is contained in:
CyC2018
2019-06-09 17:04:10 +08:00
parent 29ba25a9d7
commit 34db2b79db
14 changed files with 160 additions and 48 deletions

View File

@ -131,7 +131,7 @@ public class Singleton {
}
```
考虑下面的实现也就是只使用了一个 if 语句 uniqueInstance == null 的情况下如果两个线程都执行了 if 语句那么两个线程都会进入 if 语句块内虽然在 if 语句块内有加锁操作但是两个线程都会执行 `uniqueInstance = new Singleton();` 这条语句只是先后的问题那么就会进行两次实例化因此必须使用双重校验锁也就是需要使用两个 if 语句
考虑下面的实现也就是只使用了一个 if 语句 uniqueInstance == null 的情况下如果两个线程都执行了 if 语句那么两个线程都会进入 if 语句块内虽然在 if 语句块内有加锁操作但是两个线程都会执行 `uniqueInstance = new Singleton();` 这条语句只是先后的问题那么就会进行两次实例化因此必须使用双重校验锁也就是需要使用两个 if 语句第一个 if 语句用来避免 uniqueInstance 已经被实例化之后的加锁操作而第二个 if 语句进行了加锁所以只能有一个线程进入就不会出现 uniqueInstance == null 时两个线程同时进行实例化操作
```java
if (uniqueInstance == null) {
@ -153,7 +153,7 @@ uniqueInstance 采用 volatile 关键字修饰也是很有必要的, `uniqueIn
#### 静态内部类实现
Singleton 类加载时静态内部类 SingletonHolder 没有被加载进内存只有当调用 `getUniqueInstance()` 方法从而触发 `SingletonHolder.INSTANCE` SingletonHolder 才会被加载此时初始化 INSTANCE 实例并且 JVM 能确保 INSTANCE 只被实例化一次
Singleton 加载时静态内部类 SingletonHolder 没有被加载进内存只有当调用 `getUniqueInstance()` 方法从而触发 `SingletonHolder.INSTANCE` SingletonHolder 才会被加载此时初始化 INSTANCE 实例并且 JVM 能确保 INSTANCE 只被实例化一次
这种方式不仅具有延迟初始化的好处而且由 JVM 提供了对线程安全的支持
@ -224,10 +224,10 @@ secondName
secondName
```
该实现在多次序列化再进行反序列化之后不会得到多个实例而其它实现需要使用 transient 修饰所有字段并且实现序列化和反序列化的方法
该实现可以防止反射攻击在其它实现中通过 setAccessible() 方法可以将私有构造函数的访问级别设置为 public然后调用构造函数从而实例化对象如果要防止这种攻击需要在构造函数中添加防止多次实例化的代码该实现是由 JVM 保证只会实例化一次因此不会出现上述的反射攻击
该实现在多次序列化和序列化之后不会得到多个实例而其它实现需要使用 transient 修饰所有字段并且实现序列化和反序列化的方法
### Examples
- Logger Classes