双重校验是对懒汉式的一种改进。
package com.pn.thread;
public class SingletonDoubleCheck {
static volatile SingletonDoubleCheck singleton;
public static SingletonDoubleCheck getInstance() {
if (singleton == null) {
// 此处控制了锁的粒度,效果就是后续获取实例不用争抢锁
synchronized (SingletonDoubleCheck.class) {
if (singleton == null) {
singleton = new SingletonDoubleCheck();
}
}
}
return singleton;
}
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
// pool.execute(()->{System.out.println(Singleton.getInstance().hashCode());});
new Thread(() -> {System.out.println(Singleton.getInstance().hashCode());}, String.valueOf(i)).start();
}
}
}
这种方式避免了每次都需要去争抢锁,第一次初始化之后每次只是通过判断获取对象