并发的有序性会导致返回空指针
class A{ private static volatil A a; private A(){} public A getInstance(){ if(a==null){ synchronized(A.class){ if(a==null) a=new A(); } } return a; }
a=new A();这条语句,他需要:开辟空间,初始化空间,指针指向空间,。
可能一个线程new,另一个线程此时因为重排序,指针不为null但是空间没有初始化。
所以给a加volatile,保证不会重排序。