Java中的JMM以及volatile

JMM

JMM:java memory model
由于从内存中读取数据需要消耗的时间比计算数据大得多,所以计算机提出了高速缓存的概念。
1.L1
2.L2
3.L3
4.内存


cpu的缓存.png

1.cpu会把要使用到的数据从内存拷贝到L3中
2.再从L3拷贝到L2
3.L2拷贝到L1,进行计算

JMM.jpg

1.当我们创建线程的时候,每个线程会对应有自己的工作空间
2.当我们需要对某个对象进行操作的时候,会把这个对象copy到自己的工作空间
3.再对这个对象进行操作
4.操作完成之后再刷新给主内存

当多个线程去修改同一个变量的时候,中间的每次修改线程并不知道别的线程做了哪些修改。这种方式会造成线程不安全,如何解决?

volatile

volatile可以解决线程的可见性问题,但不能保证原子性
1.会在每次进行操作之前,强制从内存读取一次
2.会在每次修改完之后,刷新一次内存
3.抑制重排序
操作流水线以及指令重排序的概念
cpu会对代码指令进行重排序
cpu可能会将1,2,3,4都先执行,等到a==5的时候再去赋值

public void xx(){
    //1
    int a=5;
    //2
    int b=10;
    //3
    int c=a;
    if(a==5){
        //4
        a=b;
    }  
}

使用情况:
1.一个线程写,其他线程读
2.写操作没有关联

实现原理

volatile会加入Lock前缀指令
1.会强制将修改后的变量写入内存
2.会将其他线程中的地址指向的数据设置为无效

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容