volatile如何保证线程安全

2025-05-09 16:56:20

1、1.箪滹埘麽volatile既然是与线程安全有关的问题,那我们先来了解一下计算机在处理数据的过程中为什么会出现线程不安全的问题。大家都知道,计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中会涉及到数据的读取和写入。由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题,由于CPU执行速度很快,而从内存读取数据和向内存写入数据的过程跟CPU执行指令的速度比起来要慢的多,因此如果任何时候对数据的操作都要通过和内存的交互来进行,会大大降低指令执行的速度。为了处理这个问题,在CPU里面就有了高速缓存(Cache)的概念。当程序在运行过程中,会将运算需要的数据从主存复制一份到CPU的高速缓存当中,那么CPU进行计算时就可以直接从它的高速缓存读取数据和向其中写入数据,当运算结束之后,再将高速缓存中的数据刷新到主存当中。我举个简单的例子,比如cpu在执行下面这段代码的时候,

volatile如何保证线程安全

2、2.当一个变量被声明为volatile时,在编译成会变指令的时候,会多出下面一行:

volatile如何保证线程安全

3、3.实际上,当我们把代码写好之后,虚拟机不一定会按照我们写的代码的顺序来执行。例如对于下面的两句代码:

volatile如何保证线程安全

4、4.实际上,对于有些代码进行重排序之后,虽然对变量的值没有造成影响,但有可能会出现线程安全问题的。具体请看下面的代码

volatile如何保证线程安全

5、5.即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。也就是说,处理器要嘛把这组操作全羿约妫鳏部执行完,中间不允许被其他操作所打断,要嘛这组操作不要执行。刚才说Java里面的运行并非是原子操作。我举个例子,例如这句代码

volatile如何保证线程安全

6、6.由于Java中的运算并非是原子操作,所以导致volatile声明的变量无法保证线程安全。对于这句话,我给大家举个例子。代码如下:

volatile如何保证线程安全
volatile如何保证线程安全
声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
相关推荐
  • 阅读量:88
  • 阅读量:34
  • 阅读量:84
  • 阅读量:29
  • 阅读量:25
  • 猜你喜欢