Java内存模型

3 篇文章 0 订阅
首先,什么是内存模型?
可以理解为在一定操作协议下,对内存或高速缓存进行读写过程的抽象.简单可以理解为内存中的数据是如何读到cpu里面的,又是如何写回内存的.
不够的硬件架构有不同的内存模型,Java为了夸平台也设计了自己的内存模型.

Java内存模型:

Java线程 <----> 工作内存 <----> 
Java线程 <----> 工作内存 <---->   Save和Load <----> 主内存
Java线程 <----> 工作内存 <---->  

Java内存模型里面有主内存和工作内存两部分,每个线程都有自己的工作内存.主内存就是物理内存,而工作内存是高速缓存或者寄存器.
在操作数据的时候,先从主内存加载数据到工作内存,完成后再写回主内存.

Java内存模型定义了以下8种原子操作:
1. lock: 锁定,作用于主内存,他把一个变量标示为线程独占状态.
2. unlock: 解锁,作用与主内存.
3. read: 读取,作用于主内存,把变量传输到工作内存.
4. load: 载入, 作用于工作内存,把变量写到工作内存中.
5. use: 使用,作用于工作内存,把工作内存中的变量传递给执行引擎.
6. assign: 赋值,作用于工作内存,把从执行引擎中接收到的变量赋值给工作内存.
7. store: 存储,作用于工作内存,把工作内存中的值传输给主内存.
8. write: 写入,作用于主内存,把工作内存传输过来的值写入主内存.

这里有4对操作:
lock <--> unlock
read <--> load
use <--> assign
store <--> write

read,load过程可以形象化的理解为:
有两个盒子A(主内存),B(工作内存). 盒子A里面有个球,现在要将A的球拿到B中. 这里有两个动作: 1, 从盒子A拿起球,相当于read. 2,把球放盒子进B,相当于load.
use和assign;store和write也可以如此理解.

如果要把一个变量从主内存拷贝到工作内存,就需要顺序执行read和load操作,如果要把变量从工作内存同步回主内存,就需要顺序执行store和write.注意,Java内存模型对于普通变量只要求顺序执行,并不要求连续执行.所以会导致一个线程可能无法看到另外一个线程对共享变量的修改,因为读取和写入的动作都不一定是连续的.

volatile变量:
volatile变量是Java虚拟机提供的最轻量级的同步机制,他有两个特点:
1. 一个线程修改后,其他线程立即可见.
2. 禁止指令重排序
这两个特点是因为Java内存模型对volatile变量设定了特殊的三个规则:
1. 线程使用前必须从主内存同步最新值,也就是read和load两条指令必须连续执行.
2. 使用完后必须立刻从工作内存同步到主内存,也就是store和write两条指令必须连续执行.
3. 执行过程无重排序.
根据这两个特点,总结出volatile变量的使用场景:
1. 一处修改,多处可见
2. 需要严格按照代码顺序执行的并发场景,如初始化.



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值