Java有序性案例
-
代码
/** * @author 晓果冻 */ public class SingleInstance { private static SingleInstance instance; private SingleInstance(){}; public static SingleInstance getInstance(){ if(instance == null){ synchronized (SingleInstance.class){ if(instance == null){ instance = new SingleInstance(); } } } return instance; } } -
执行流程

-
顺序性问题点
instance = new SingleInstance();//这行代码包括如下三个步骤- 分配内存空间
- 初始化对象
- 将instance引用指向内存空间。
正常执行顺序:1->2->3,但cpu指令重排后可能位1->3->2这种
-
假设执行顺序:
- 线程
A和线程B同时进入第一个if条件判断。 - A线程首先获取到
synchronized锁,进入代码块,此时instance为null,所以执行instance=new SingleInstance()语句。 - 在执行
instance = new SingleInstance();时,线程A在JVM开辟一块空白的内存空间。 - 线程A将instance引用指向空白的内存空间,在没有进行对象初始化时,发生了线程切换,线程
A释放锁。 - 线程B拿到锁,发现
instance不为null,但此时instance并未初始化,是一个空对象。如果线程B使用instance对象,可能就会出现问题。
- 线程
-

评论区