工作内存和主内存之间的变量刷新时机

前言
线程是操作系统中最小的工作业务单元,在执行业务逻辑时,线程会把主内存中的变量值copy到线程自己的工作内存中,后续发生的读写操作都是对工作内存中的副本变量进行的。
由于线程什么时候将工作内存中的副本变量更新到主内存的时机并不是固定的,线程在读取主内存和刷新主内存变量的操作也并非原子性的,所以在多线程的时候,就会引起并发问题。下面的几种场景介绍了工作内存和主内存之间刷新时机。

将主内存中的值读取到工作内存

  • 当工作内存中没有主内存的变量副本时,会将主内存中的值读取到工作内存
  • 当线程获取到锁时
  • 线程发生上下文切换时,比如调用wait(), sleep()等阻塞方法再到线程恢复运行,此时线程就进行了一次上下文切换,值得一提的是,调用System.out等相关方法引起的I/O阻塞,也会刷新工作线程中的变量。
  • 当变量被volatile修饰引起的副本失效时

将工作内存中的值更新到主内存

  • 线程在释放锁之前会将工作内存中的变量更新到主内存
  • 修改volatile修饰的变量时

volatile保证了内存可见性,当修改被volatile修饰的变量后,会强制将工作内存中的值更新到主内存,并且使其他线程工作内存中缓存了该变量的副本失效。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值