美文网首页
Java中的JMM以及volatile

Java中的JMM以及volatile

作者: 被虐的小鸡 | 来源:发表于2020-07-24 17:39 被阅读0次

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.会将其他线程中的地址指向的数据设置为无效

相关文章

网友评论

      本文标题:Java中的JMM以及volatile

      本文链接:https://www.haomeiwen.com/subject/ytbjlktx.html