JMM模型

😊(1).计算机底层CPU模型

          如果三个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级别


😊(4)线程的生命状态


😊(5)线程执行切换(时间片算法)底层模型

1、首先CPU在执行不用线程任务的话会有一种时间片算法,也就是把一个任务分成一个一个的时间片来执行。

2、在时间片的切换过程中,如果当前CPU正在执行时间片A执行完要切换到时间片B,就要把A的当前的所有状态(指令,程序指针,中间数据)都回写到主内存中的TSS(任务状态断)中,之后开始执行时间片B执行完之后如果下一个被执行的是A的话会重新把A的状态从TSS中读出来接着继续执行,

😊(6)JMM模型如何保证操作的 原子性和有序性和可见性

     1.数据可见性,比如两个线程在访问同一块内存区域数据的时候如下图代码,当线程A开始执行的时候会先把数据从主内存中Load进工作副本在副本中复制一份主内存中的数据,然后use推进CPU因为A线程这里做了一个死循环,当前线程就一直在执行这个操作,一直不断的use推进CPU由于他优先级比较高所以会一直占用线程着A,此时线程B开始执行同样从主内存load后推入CPU把值改为ture后在assign进工作内存把值改为true后写回主内存把主内存的值也改为true,此时线程A还在进行循环不断推进中,无法感知到值被改为true,如果在load方法中while循环里加上一把锁这样会使线程A可能会阻塞从而导致线程的执行权被抢走,因为是时间片算法在抢走时会把状态回写到主内存中等到再获CPU的执行权再读进工作内存中,这个操作可能会导致工作内存会重新读取主内存中值,此时值是被线程B改过了所以此时可以保证数据一致。

     2.如果在initflag变量前加上关键字,volatile就会开启缓存一致性协议来保持线程间不同工作副本的数据可见性


     3.有序性:操作要保持有序性是因为JVM在执行一些操作时候如果交换执行顺序不影响(单线程)最终结果的时候,可能会把执行顺序改变但在多线程情况下情况比较复杂,比如单例模式双重检查锁就存在这个问题,可以加上volatie关键字禁止cpu和jvm对当前操作的指令重排。

       3.1指令重排是发生在那个阶段呢?

        答: 执行器编译阶段也就是加载class文件编译成字节码的时候和cpu运行时也就是cpu执行汇编指令时执行的。

       3.2通过插入屏障的方式来限制指令重排,屏障有 storeload写读屏障,loadstore读写屏障,loadload读读屏障,storestore写写屏障,如下图第一个a=1是volatile写操作,第二个x=b是先volatile读操作再普通写操作,jvm会在中间插入写读屏障保证不被指令重排


       3.3如果不使用volatile的时候怎么禁止指令重排呢?

       答:java提供了一个类 Unsafe 的fullFence(),loadFence(),storeFence(),三个方法手动添加内存屏障。

    4.原子性:volatie不能保证操作的原子性,原子性得通过关键字保证,原子性指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。比如i++就不是一个原子性操作。


   5.总线风暴:总线风暴的产生就是从主内存到工作内存中如果开启了缓存一致性协议的话,线程嗅探过多或者频繁访问工作内存过多就对引起,这时读写效率都将会大大下降

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,816评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,729评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,300评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,780评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,890评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,084评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,151评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,912评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,355评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,666评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,809评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,504评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,150评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,121评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,628评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,724评论 2 351