Java高并发--CPU多级缓存与Java内存模型

本文探讨了CPU多级缓存存在的原因,包括时间局部性和空间局部性原理,并解释了Java内存模型中主内存与工作内存的交互,以及8种原子操作。在高并发场景下,线程间的通信和同步问题可能导致线程不安全,通过示例展示了并发自增操作可能出现的问题。解决方案包括信号量控制并发量、重入锁和原子变量等。
摘要由CSDN通过智能技术生成

CPU多级缓存

为什么需要CPU缓存:CPU的频率太快,以至于主存跟不上,这样在处理器时钟周期内,CPU常常需要等待主存,浪费了资源。所有缓存的出现是为了缓解CPU和主存之间速度不匹配的问题——将运算所需数据复制到缓存中,使得运算能快速进行;当运算结束后再将缓存同步回内存中,这样处理器无需等待缓慢的内存读写。
【加群】:857565362
缓存并非存储了所有的数据,那么它存在的意义是什么?
1)时间局部性:如果某个数据被访问,那么它在不久的将来有可能被再次访问
2)空间局部性:如果某个数据被访问,那么与它相邻的数据很快可能被访问
高并发是进阶架构师重要一步,需要学习的内容有很多。在此,分享一下整理的内容,包含进阶路线以及技术资料的整理,需要的朋友自行领取。

Java内存模型

下图中是JVM中堆和栈的关系,在不同的线程中,可能有多个变量,它们指向的是堆上的同一个对象,这些变量都是该对象的“私有拷贝”。私有表示仅在当前线程可访问,拷贝是说这是该对象的一个引用。
【加群】:857565362
线程A和线程B之间如果要通信的话,必须经历以下两个步骤:
1)线程A将本地内存(工作内存)中的变量刷新到主内存中
2)主内存将变量复制到本地内存B中,使得线程B在读取变量时更快
【加群】:857565362
Java内存模型中,所有的变量都存储在主内存中,每条线程还有自己的工作内存(与高速缓存类比),线程对变量的所有操作都必须在工作内存中进行,不能直接读写主内存中的变量;不同的线程之间也无法直接访问对方工作内存中的变量,线程间变量值的传递均需通过主内存完成。
如果将Java内存模型和Java堆、栈比较,主内存对应Java堆中的对象实例部分,工作内存对应虚拟机栈中的部分。
主内存和工作内存之间需要交互,Java内存模型中有8种原子操作:
1)lock:作用于主内存变量,将其标识为线程独占。
2)unlock:作用于主内存变量,将其从锁定状态释放,释放后才可被其他线程锁定。
3)read:作用于主内存的变量,将一个变量从主内存中传输到工作内存中,以便随后的load动作使用。
4)load:作用于工作内存中的变量,把read操作从主内存中得到的变量值放入工作内存的变量副本中。
5)use:作用于工作内存的变量,把工作内存中的一个变量的值传递给执行引擎,当虚拟机需要使用到变量的值的字节码指令时会执行这个操作。
6)assign:作用于工作内存的变量,把一个从执行引擎接受到的值赋给工作内存中的变量。当虚拟机遇到一个给变量赋值的字节码指令时执行这个操作。
7)store:作用于工作内存中的变量,把工作内存中的一个变量的值传送到主内存中,以便之后write操作使用。
8)write:作用于主内存中的变量,把store操作从工作内存中得到的变量值放入主内存的变量中。
如果一个变量从主内存复制到工作内存,必须先执行read然后执行load操作(read和load之间允许插入其他操作,只要保证这个顺序即可);如果要把变量从工作内存同步回主内存中,需要先执行store操作然后执行write操作(store和write之间允许插入其他操作,只要保证这个顺序即可)。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值