双重检查加内存屏障保证单例设计模式安全性
synchronized 锁:保证该代码块只能有一个线程;
volatile 关键字:保证可见性(volatile 变量被修改后,新值被其他线程立即可见)
禁止指令重排(防止执行sig=new sigleton() 语句时,指令重排)
class sigleton{
//volatile 设置内存屏障,保证懒汉式单例模式线程安全
private static volatile sigleton sig;
private sigleton() {}
public static sigleton getInstance() {
//加锁,保证一个线程进入
synchronized(sigleton.class) {
if (sig==null) {
//检查是否由多个线程进入
if (sig==null) {
sig=new sigleton();
}
}
}
return sig;
}
public void print() {
System.out.println("double lock");
}
}
public class Test {
public static void main(String[] args) {
sigleton instance=null;
instance=sigleton.getInstance();
instance.print();
}
}