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
对象,可能就会出现问题。
- 线程
评论区