废话不多说,代码即注释。B站教学资源结合网上博客的改良版,加入了测试功能,以及关键代码的说明。
虽然比网上其他的极简版代码复杂了一些,但学会了之后,面试绝对秒杀,呵呵。
package interview;
public class DoubleCheckedLocking {
/*
DCL单例模式,在懒汉式的套路上加入并发控制,保证在多线程环境下,对外仅存在一个对象。
不加并发控制,在多线程环境下可能出现冲突。例如,B线程从内存中读取的时候,A线程还没有完成写入
单例模式的套路:
1. 构造器私有化
2. 提供私有的静态属性
3. 提供公用的静态方法,返回2中的属性
*/
/*
私有静态属性
如果直接new对象,就是饿汉式
如果没有new对象,是null,就是懒汉式
DCL单例模式使用懒汉式
此处的volatile可以避免指令重排
*/
private static volatile DoubleCheckedLocking instance;
/*
公用静态方法,返回单例的对象
不使用DCL,就要将这个方法整个synchronized,比较耗时
public static DoubleCheckedLocking getInstance() {
if (null == instance) {
instance = new DoubleCheckedLocking();
}
return instance;
}
*/
public static DoubleCheckedLocking getInstance(long delay) {