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

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

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