JMM(JavaMemoryModel)
2022-03-19 00:40:53 0 举报
AI智能生成
Java 内存模型
作者其他创作
大纲/内容
这里只是缓存行Cache line操作如果数据大于缓存行会变成总线锁
例子
@sun.misc.Contended
怎么解决伪共享?
缓存行伪共享
Store Bufferes
Store Bufferes的风险
CPU切换状态阻塞解决-存储缓存(Store Bufferes)
硬件内存模型
MESI优化和他们引入的问题
CPU缓存一致性MESI
图形理解
介绍
主内存
工作内存
与硬件内存架构
在不同平台都可运行
存在的必要性
JMM模型
JMM模型产生的同步问题
lock 锁定
unlock 解锁
read 读取
load 载入
use 使用
assing 赋值
store 储存
write 写入
同步规则分析
八大原子操作
同步问题
synchronized
Lock
思路同一时间只有一个线程访问
解决
原子性
JMM线程私有的工作空间和主内存不实时同步
发生的原因
原理:共享变量修改实时同步,其他线程立马读取
保证被volatile修饰的共享变量对所有线程总数可见的,也就是当一个线程修改了一个被volatile修饰共享变量的值,新值总是可以被其他线程立即得知。
禁止指令重排序优化。
内存语义
注意:无法保证原子性
内存屏障
实现
volatile
可见性
指令重排
as-if-serial语义
原因
happens-before 原则
Java内存模型
sychronized
有序性
lfence
sfence
mfence
Lock前缀 并非内存屏障
Intel硬件提供了一系列的内存屏障,主要有:
保证load1的读取操作在load2及后续读取操作之前执行
Load1; LoadLoad; Load2
LoadLoad
在store2及其后的写操作执行前,保证store1的写操作已刷新到主内存
Store1; StoreStore; Store2
StoreStore
在stroe2及其后的写操作执行前,保证load1的读操作已读取结束
Load1; LoadStore; Store2
LoadStore
保证store1的写操作已刷新到主内存之后,load2及其后的读操作才能执行
Store1; StoreLoad; Load2
StoreLoad
不同硬件的实现不同java内存模型屏蔽这种底层硬件平台的差异,由JVM来为不同的平台生成相应的机器码。 JVM中提供了四类内存屏障指令:
1 是保证特定操作的执行顺序
2 是保证某些变量的内存可见性(利用该特性实现volatile的内存可见性)
作用
描述
memory = allocate();//1.分配对象内存空间instance(memory);//2.初始化对象instance = memory;//3.设置instance指向刚分配的内存地址,此时instance!=null
memory=allocate();//1.分配对象内存空间instance=memory;//3.设置instance指向刚分配的内存地址,此时instance!=null,但是对象还没有初始化完成!instance(memory);//2.初始化对象
由于步骤1和步骤2间可能会重排序,如下:
另外的线程用memory调用但是没有instance没初始化就会出现一些问题
问题
//禁止指令重排优化private volatile static DoubleCheckLock instance;
因为instance = new DoubleCheckLock();可以分为以下3步完成(伪代码)
代码例子
并发编程问题
JMM(Java Memory Model)
0 条评论
回复 删除
下一页