java线程内存模型JMM

本文深入探讨Java线程内存模型(JMM),解释线程如何通过主内存与本地内存交互,确保变量可见性和一致性。讨论happens-before规则、as-if-serial语义、volatile关键字的作用,以及AQS和final修饰符在并发控制中的应用。

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

java线程内存模型JMM

线程共享变量存储在主内存中,每个线程都有自己的本地内存,内部存有共享变量的副本,本地内存是一个抽象概念,它是缓存、寄存器、硬件和编译器优化的合集。

保证内存可见性:内存模型的happens-before规则,也就是前一个操作执行的结果对后一个操作可见(并不保证前一个操作在后一个操作前执行,这是java在首先保障结果正确的前提下做出的允许编译器和硬件优化让步),要求happens-before规则的场景有:同一个线程的先后语句、加锁和解锁、对volatile变量的写要先于读、规则的传递性。

as-if-serial语义:指令重排序不影响单线程程序执行的结果

volatile之所以可以保证可见性是因为它把单个变量的读写操作加锁了,happens-before规则使其拥有可见性,任何线程都会读到刚刚写入的volatile变量。写入volatile变量时会把线程本地内存的共享变量刷新到主存。

AQS底层依赖的就是volatile修饰的state变量,采用CAS来修改state变量,再利用原子读写,来确保JUC的实现。

final有一个特点,不能使用默认初始化,要么在定义时初始化,要么在构造函数中初始化。这是为了保护其他线程不读到final未初始化的数据。对于final的值写入和赋值引用是禁止指令重排的,读到包含final的对象和读取final域也是禁止指令重排的,为的就是保护final。

转载于:https://www.cnblogs.com/shizhuoping/p/11556750.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值