java多线程内存管理以及可见性

本文深入探讨了Java内存模型(JMM)的基本概念,包括线程共享变量的访问规则、多线程可见性的实现方法,以及synchronized和volatile关键字的作用机制。

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

JMM(java内存模型) 描述Java程序中各种内存(线程共享变量)的访问规则。所有变量都存在于主内存中,每个线程都有自己独立的工作内存,线程间不可以直接互相操作其工作内存中的变量,以及主内存的变量,只能以主内存为媒介做改变。

多线程的可见性实现有两种方式:(其实finally也算一种)

1,通过synchronized实现,synchronized(属性的意思:1,给线程加锁2,实现可见性)

synchronize是通过:获取互斥锁->清空工作区内存->从主内存copy值到工作内存->执行代码->把值放回主内存->释放互斥锁

重排序的概念:编译器或者处理器为了提高程序性能而对代码编译时进行重新的排序,可能会导致代码真正的执行顺序与书写顺序不一样。

as-if-serial 的意思是在单线程下无论程序怎样重排序其执行结果永远一致,故不会带来内存可见性问题, 多线程可能不遵循此定律,所以可能导致内存可见性问题。


2,通过volatile关键字实现:(1,实现可见性,但不可以实现原子性)

volatile是通过加入内存屏障和禁止重排序实现可见性的。比如写操作之后的store屏障命令和读操作之前的load屏障命令。

store是在写之后强制把工作内存的值刷新到主内存,(其中是用清空工作内存的值才來实现重新取值的)load相反先从主内存取到值到工作内存,然后再读。

如何实现原子性:加锁eg, synchronize或者 reentranlock

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值