JMM
JMM:java memory model
由于從內(nèi)存中讀取數(shù)據(jù)需要消耗的時間比計算數(shù)據(jù)大得多讼渊,所以計算機(jī)提出了高速緩存的概念。
1.L1
2.L2
3.L3
4.內(nèi)存
cpu的緩存.png
1.cpu會把要使用到的數(shù)據(jù)從內(nèi)存拷貝到L3中
2.再從L3拷貝到L2
3.L2拷貝到L1荞彼,進(jìn)行計算
JMM.jpg
1.當(dāng)我們創(chuàng)建線程的時候,每個線程會對應(yīng)有自己的工作空間
2.當(dāng)我們需要對某個對象進(jìn)行操作的時候抬伺,會把這個對象copy到自己的工作空間
3.再對這個對象進(jìn)行操作
4.操作完成之后再刷新給主內(nèi)存
當(dāng)多個線程去修改同一個變量的時候捉撮,中間的每次修改線程并不知道別的線程做了哪些修改。這種方式會造成線程不安全野舶,如何解決?
volatile
volatile可以解決線程的可見性問題宰衙,但不能保證原子性
1.會在每次進(jìn)行操作之前平道,強(qiáng)制從內(nèi)存讀取一次
2.會在每次修改完之后,刷新一次內(nèi)存
3.抑制重排序
操作流水線以及指令重排序的概念
cpu會對代碼指令進(jìn)行重排序
cpu可能會將1供炼,2一屋,3,4都先執(zhí)行袋哼,等到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.寫操作沒有關(guān)聯(lián)
實現(xiàn)原理
volatile會加入Lock前綴指令
1.會強(qiáng)制將修改后的變量寫入內(nèi)存
2.會將其他線程中的地址指向的數(shù)據(jù)設(shè)置為無效