- 在并发编程中 我们经常会遇到三个问题,原子性,可见性 和有序性
原子性是指多个操作,要么全部执行,要么全部不执行。有点类似于数据库中的事务。
可见性是指其他线程可以看见某个线程对同一个变量操作后的值。
有序性是指程序的运行具有有序性。例如代码的执行从上往下 创建对象一般分为三步
1.分配内存空间。
2.初始化对象
3.将该内存空间的地址赋值给该对象
static volatile EventBus defaultInstance;
public static EventBus getDefault() {
if (defaultInstance == null) {
synchronized (EventBus.class) {
if (defaultInstance == null) {
defaultInstance = new EventBus();
}
}
}
return defaultInstance;
}
但是根据JMM的指令重排序实际过程可能会走1-3-2
因为内存地址是存在的,
所以不会走 if (defaultInstance == null) {
defaultInstance = new EventBus();
}所以会返回一个还未初始完成的对象
当一个变量被volatile所修饰的时候也就保证了可见性,即当一个线程改变了这个变量的值,其他线程也能看到。也就是说Volatile保证了写在读取之前。还有就是它可以禁止指令重排序。
双重校验单例为什么需要volatile
最新推荐文章于 2022-12-06 11:13:42 发布