<Java 并发编程实践>读书笔记 --- 重排序

本文深入探讨Java内存模型及其对重排序的影响,解释了编译器优化、指令级并行和内存系统重排序的基本概念,并着重阐述了volatile关键字在确保内存可见性方面的关键作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在单个线程中只要重排序不会对结果产生影响,那就不能保证其中的操作一定按照程序写定的顺序执行,

即使重排序对其他线程来说会产生明显的影响。


局部变量(Local variables) 方法定义参数(formal method parameters)和 异常处理参数(exception handler parameters)
不会在线程之间共享,它们不会有内存可见性问题,也不受内存模型的影响
JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存,每个线程都有一个私有的本地内存(Local memeory),
本地内存存储了该线程读写共享变量的副本


重排序


1.编译器优化的重排序
编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序
2.指令级并行的重排序。

现代处理器采用指令级并行技术(Instruction-Level Parallelism,ILP),将多条指令重叠执行,
如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序
3.内存系统的重排序。

由于处理器使用缓存和读写缓冲区,这使得加载和存储操作看上去可能是乱序执行的
源代码---》1.---》2----》3---》最终执行的指令序列


当一个域声明为volatile类型后,编译器于运行时会监视这个变量:它是共享的,

而且对他的操作不会与其他的内存操作一起呗重排序。volatile变量不会缓存在寄存器或者缓存在对其他处理器隐藏的地方,

左移读一个volatile类型的变量时,总会返回某一线程所写入的最新值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值