Jvm03-Java Memory Model (内存模型)

1、硬件层的并发优化基础知识

在这里插入图片描述
在这里插入图片描述

硬件层面需要解决,当我们的数据分配的不同的CPU后数据的一致性问题

在这里插入图片描述

解决1: 总线锁
	- 效率低,一个CPU去总线访问X,被上了锁,另一个CPU去访问Y也需要等待,因为把整个总线进行了上锁。

在这里插入图片描述

英特尔采用 MESI 一致性协议 称为缓存锁
给每一个缓存的内容做了一个标记
	- CPU读取到一个数进来,和主存相比如果发生修改,标记为Modified
	- 如果这个数被我独有,标记为Exclusive
	- 如果我读的时候,你也在读,标记为Shared
	- 如果我读的时候,被别的CPU改过,(读进来的时候是2,被其他CPU修改为3了)标记为Invalid
	通过四种状态,来进行处理
但是MESI并没有完全解决锁总线的问题,现在的CPU依然需要总线锁。
	比如有些数据比较大,无法缓存。必须使用总线锁。
现代CPU的数据一致性的实现 = 缓存锁(MESI...等协议) + 总线锁

在这里插入图片描述

什么是cache line?
	读取缓存,以cache line 为基本单位,目前多数为64Byte
缓存行的伪共享?
	位于同一缓存行的不同数据,被不同CPU锁定,产生相互影响的伪共享问题。
	若一个CPU修改了X,另一个CPU会将整个缓存行设置为Invalid,通知其他CPU更新整个

在这里插入图片描述

缓存航如何提高效率?
	- 使用缓存行对齐。8 * 8 = 64Byte
	- 号称效率最高的队列,disruptor 保证无论如何我的cursor指针不管跟前面对齐还是跟后面对齐,都不会和其他数据混在同一个缓存行

在这里插入图片描述

2、乱序问题

CPU为了提高指令执行效率,会在一条指令执行过程中,去同时执行另一条指令,前提是,两条指令没有依赖关系。

在这里插入图片描述
3、如何保证特定情况下不乱序

硬件级别如何保证

Jvm级别如何保证
volatile 实现细节
	字节码层面: 
		Access_flag 加了一个访问符Volatile
	Jvm层面:
		Volatile在读写操作前后都加了一个内存屏障
		StoreStoreBarrier
		Volatile 写操作
		StoreLoadBarrier
	--------------------------
		LoadLoadBarrier
		Volatile
		LoadStoreBarrier
synchronized 实现细节
	字节码层面:
		同步方法	Access_flag 加了一个访问符Synchronized
		同步代码块	Monitorenter Monitorexit
	Jvm层面:
		C++调用了操作系统的同步机制

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值