面试:Volatile保证有序和可见性原理

Volatile如何保证有序性(禁止指令重排)
1、首先我们要了解计算机在执行程序时,为了提高性能,编译器和处理器一般都会对指令做重排,一般分为以下三种:

在这里插入图片描述
单线程环境里面确保程序最终执行的结果和代码顺序执行的结果一致。
处理器在进行指令重排时必须要考虑指令之间的数据依赖性。
多线程环境中线程交替执行,由于编译器优化重排的存在,两个或多个线程中使用的变量能否保证一致是不能确定的,最后执行的结果也是无法预测的。

2、volatile实现禁止指令重排优化,从而避免在多线程环境下程序出现乱排序执行的现象。
内存屏障,也称为内存栅栏,他是一个cpu的指令。作用有两个:

一是保证特定操作的执行顺序;

二是保证某些变量的内存可见性(volatile的内存可见性是利用该特性实现的)

3、由于编译器和处理器都能执行指令重排优化,如果在指令之间插入一条内存屏障则会告诉编译器和cup不管在任何情况下,无论任何指令都不能和这条内存屏障进行指令重排,也就是说通过插入内存屏障禁止在内存屏障前后的指令执行重排序优化。内存屏障的另外一个作用就是强制刷出各种CPU的缓存数据,因此在任何CPU上的线程都能读取到这些数据的最新值。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/cpcpcp123/article/details/128187461
今日推荐