JMM模型
如果三个cup的线程都从主内存中取到X=1的值进行计算,此时就要保证数据的一致性,目前CPU使用MESI(缓存一致性协议)来控制,如果CPU1想从主内存拿到X=1这个值想要计算,首先寄存器会在本身寻找如果没有,则去缓存L1,L2,L3中依次寻找,如果都没有则去主内存中拿到CPU缓存中最终放入寄存器计算,拿到后将X标注为E独占状态,标记为E的同时又开启了总线嗅探机制会时刻监听内存中X值,如果此时CPU2去拿主内存中的X=1在经过总线时会被监听到,此时CPU1会将缓存行中的X状态改为S共享状态,CPU2读到值后也会标注为S共享状态,如果CPU1把X=1进行计算后,得到X=2此时CPU1会把X的缓存行锁住并且状态置M修改,在把X=2回写到主内存中消息经过总线会被CPU2监听机制监听到此时CPU2会把之前读到的X=1置为I失效(大写字母哎),然后接着CPU1会把X=2回写到主内存中回写完以后又会把CPU1中的X=2置为E独占状态,如果CPU2还访问得到X就要把之前存在缓存中的X=1丢弃,然后去主存 中重新得到X=2,读完之后CPU1嗅探到了CPU2读到主存中的数据此时CPU1与CPU2又会把自己的状态变成共享S了。
😊(2)MESI缓存一致性协议
😊(3)线程分为用户级别和内核级别线程,比如java虚拟机 PS 或者播放器这些进程他们开启一些线程,这些线程被称作虚假线程不能真实操作CPU,他们需要被内核级线程提供的接口接收转换,真正接触CPU的是内核级线程,CPU有Ring0,Ring3这些特权级别,如果想操作CPU的话只能是Ring0级别也就是说只有内核级线程才能接触到他,用户级线程是用的ring3级别
3.有序性:操作要保持有序性是因为JVM在执行一些操作时候如果交换执行顺序不影响(单线程)最终结果的时候,可能会把执行顺序改变但在多线程情况下情况比较复杂,比如单例模式双重检查锁就存在这个问题,可以加上volatie关键字禁止cpu和jvm对当前操作的指令重排。
答: 执行器编译阶段也就是加载class文件编译成字节码的时候和cpu运行时也就是cpu执行汇编指令时执行的。
答:java提供了一个类 Unsafe 的fullFence(),loadFence(),storeFence(),三个方法手动添加内存屏障。
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...