JMM(Java Memory Model)

一、概念

JMM是Java内存模型

为了屏蔽硬件和操作系统内存访问差异,jvm规定的统一的一套内存访问模型(主存(存线程共享数据)+工作内存(存线程私有及共享变量的拷贝))

二、主内存与工作内存

线程、主内存、工作内存三者的交互关系:

 

三、内存间交互操作

 八个原子性的字节码指令(用于主存和工作内存数据的读取操作)

lock(锁定) : 作用于主内存的变量,它把一个变量标识为一条线程独占的状态

unlock(解锁) : 作用于主内存的变量,它把一个处于锁定状态的变量释放出来,释放后的变量才可

以被其他线程锁定。

read(读取) : 作用于主内存的变量,它把一个变量的值从主内存传输到线程的工作内存中,以便随

后的load动作使用。变量从主存读取到中间内存

load(载入) : 作用于工作内存的变量,它把read操作从主内存中得到的变量值放入工作内存的变量

副本中。变量从中间内存读取到工作内存

use(使用) : 作用于工作内存的变量,它把工作内存中一个变量的值传递给执行引擎。使用变量参与计算

assign(赋值) : 作用于工作内存的变量,它把一个从执行引擎接收到的值赋给工作内存的变量。把值赋给变量

store(存储) : 作用于工作内存的变量,它把工作内存中一个变量的值传送到主内存中,以便后续的

write操作使用。

write(写入) : 作用于主内存的变量,它把store操作从工作内存中得到的变量的值放入主内存的变量

中。

四、Java内存模型三大特性

原子性:指八大字节码指令是原子
可见性:一个线程修改共享变量是否对另一个线程可见,volatile、synchronized保证可见性
有序性:一个线程看自己代码有序,看别的线程代码执行都是无序的

五、volatile

使用场景:

修饰变量,如果变量的操作本身是原子性的,就可以保证线程安全

作用:

1.保证此变量对所有线程的可见性

2.禁止指令重排序,建立内存屏障

as-if-serial原则:保证单个线程看自己有序

happens-before原则(先行发生原则):规定哪些指令先执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值