代码是能保证原子性,但是 A a=new A()分为三条指令1.给A的对象分配内存 2.初始化A的对象 3.a引用指向刚才分配的内存。如果防治指令重排,极有可能指令顺序变成了 1 3 2(与CPU多级流水线防治指令相关有关)。当线程1拿了类锁,开始实例化的时候,万一顺序变成 1 3 2且刚走到3还没到2,这时候来了线程2 一看a引用不为null,线程2都没到同步块直接返回a了,但是a指向一片没有初始化过的内存……肯定出错吧