volatile理解
2022/2/22 6:24:51
本文主要是介绍volatile理解,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
https://www.cnblogs.com/dolphin0520/p/3920373.html
volatile有两层语义:
1.保证多线程对变量操作时的可见性,即一个线程对变量修改后,对其他线程立刻可见。
2.禁止指令重排序。
第一点,在计算机内存模型上存在数据缓存一致性的问题。因为在执行程序时所有的指令都是在CPU上面进行执行的,指令执行过程中又会涉及到数据的读和写,由于数据存储在内存中,而CPU执行又非常快,从内存读取数据和向内存写入数据对于CPU执行来说是非常慢的会降低效率,因此CPU里面就多了一个高速缓存,将内存的数据提前读取到高速缓存中,然后CPU通过高速缓存进行数据的读写计算。执行完后再将数据刷新到内存中。
比如,两个线程同时执行一个语句 i=i+1
初始时,两个线程分别读取i的值存入各自所在的CPU的高速缓存当中,然后线程1进行加1操作,然后把i的最新值1写入到内存。此时线程2的高速缓存当中i的值还是0,进行加1操作之后,i的值为1,然后线程2把i的值写入内存。
最终结果i的值是1,而不是2。这就是著名的缓存一致性问题。通常称这种被多个线程访问的变量为共享变量。
也就说,一个变量在多个缓存中,就可能造成缓存一致性问题。
为了解决缓存一致性问题。,通常来说有以下2种解决方法:
1)通过在总线加LOCK#锁的方式
2)通过缓存一致性协议
这篇关于volatile理解的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-26Mybatis官方生成器资料详解与应用教程
- 2024-11-26Mybatis一级缓存资料详解与实战教程
- 2024-11-26Mybatis一级缓存资料详解:新手快速入门
- 2024-11-26SpringBoot3+JDK17搭建后端资料详尽教程
- 2024-11-26Springboot单体架构搭建资料:新手入门教程
- 2024-11-26Springboot单体架构搭建资料详解与实战教程
- 2024-11-26Springboot框架资料:新手入门教程
- 2024-11-26Springboot企业级开发资料入门教程
- 2024-11-26SpringBoot企业级开发资料详解与实战教程
- 2024-11-26Springboot微服务资料:新手入门全攻略