首页 > 编程学习 > volatile

volatile

发布时间:2022/10/1 9:20:19

​📒个人主页:无乱码元素响应📒
​❤️感谢大家阅读本文,同时欢迎访问本人主页查看更多文章​❤️
🙏本人也在学习阶段,如若发现问题,请告知,非常感谢🙏

volatile原理

volatile的底层实现是内存屏障,Memory Barrier
对volatile变量的写指令后会加入写屏障
对volatile变量的读指令前会加入读屏障

如何保证可见性

1、写屏障保证在该屏障之前的,对共享变量的改动,都同步到主存中
2、而读屏障保证在该屏障之后对共享变量的读取都加载的是主存中的数据

如何保证有序性

1、写屏障会确保指令重排时,不会将写屏障之前的代码排在写屏障之和
2、读屏障会确保指令重排序时,不会将读屏障之后的代码排在读屏障之前

不能解决指令交错
写屏障仅仅是保证之后的读能够读到最新的结果,但不能保证都跑到它前面去
而有序性的保证也只是保证了本线程内相关代码不被重排序

JMM模型

java 内存模型规定所有变量都存储在主内存中,此处所指的变量是实例字段、静态字段等,不包含局部变量和函数参数,因为这两种是线程私有无法共享。

每条线程还有自己的工作内存,工作内存保存了该线程使用到的变量到主内存副本拷贝,线程对变量的所有操作(读取、赋值)都必须在自己的工作内存中进行而不能直接读写主内存的变量,不同线程之间无法相互直接访问对方工作内存中的变量,线程间变量值的传递均需要在主内存来完成
在这里插入图片描述

一个变量的值改变需要进行那些步骤
1、首先会执行一个read操作将主内存中的值读取出来
2、执行load指令操作将副本写到工作内存中
3、当前线程执行use操作将工作内存中的值拿出在经过执行引擎运算
4、将运算后的值执行assign操作写到工作内存
5、执行store线程将当前工作内存中新的值存储回主内存,注意只是此处还没有写入到主内存的内存变量
6、执行write操作将主内存中的值刷新到共享变量

在这里插入图片描述

lock:如果对一个变量执行lock,那么他会清空内存中此变量的值
unlock:如果对一个变量执行unlock,必须把此变量同步到内存中

volatile做了那些事情呢?

每个线程操作数据时候都会把数据从主内存读取到自己的工作内存,如果他操作了数据并且写入了,那其他线程的变量副本就会失效,需要数据进行操作又要去主内存中读取

volatile保证了不同线程对共享变量操作的可见性,也就是说一个线程修改了volatile修改的变量,当修改写回主存时,另外一个线程立即看到最新的值

什么是重排序

在Java内存模型中,允许编译器和处理器对指令进行重排序,但是重排序过程中不会影响到单线程的执行,在单线程下有着一个as-if-serial的概念

as-if-serial 的概念就是:不管怎么重排序,单线程下的执行结果都不能被改变

JVM层面的内存屏障

在这里插入图片描述

Copyright © 2010-2022 mfbz.cn 版权所有 |关于我们| 联系方式|豫ICP备15888888号