public class Single {
private volatile static Single instance;
private Single() {
}
public static Single getInstance() {
if (null == instance) {
synchronized (Singleton.class) {
if (null == instance) {
instance= new Single();
}
}
}
return instance;
}
}
思路记录一下:
因为第一次判断instance是否为null的时候参与竞争进入同步代码块的线程可能不止一个,但是一次只有一个能够进入同步代码块,其他的线程会进入阻塞状态等待锁的释放。当第一个进入同步代码块的线程创建好实例后退出同步代码块释放锁,这个时候处于阻塞状态线程立马被通知激活重新参与锁的竞争,当获得锁的线程进入同步代码块时其实已经有一个实例了,所以为了保证单例要进行二次检测。
此处volatile作用:防止指令重排列