JMM并发模型

  1. 并行和并发
    并行:同一时刻,多条命令在多个处理器执行
    在这里插入图片描述

并发:同一时刻只能有一条指令执行
在这里插入图片描述
2. 并发期间数据可见性如何保证
以下图举例

有两个线程,其中一个线程会去修改flag的值,什么时候可以跳出循环呢?

Thread.yield() 会使上下文切换,重新分配时间片后,会从主内存读取数据

第二个: while(flag) 系统会任务是实时需要的数据,会一直从缓存中查询,当我们睡秒一定的时间(跟计算机底层有关了),他会从主内存去查询数据,这时候也会查询最新的数据

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

volatile也可以查询最新的数据,如何实现呢?
JVM层面会插入内存屏障
C的底层是Lock前缀指令,会等待他之前的命令全部执行完,然后写回主内存,并且使其他副本中缓存的数据失效

在while方法体加入 System.out.println(“结束了”);
也可以插入内存屏障,原理是:
在这里插入图片描述

IDEA查看汇编指令
https://dandelioncloud.cn/article/details/1525252308191690753

假设上边的代码,count是Integer类型的,那么也会从主内存查询最新数据
Integer底层的value是final类型的,每次装箱都会new 新的对象
但是-128~127都会从常量池获取
在这里插入图片描述
在这里插入图片描述
像sleep等很多方法底层都是调用park方法,等待唤醒
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值