- 并行和并发
并行:同一时刻,多条命令在多个处理器执行
并发:同一时刻只能有一条指令执行
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方法,等待唤醒