請你談談對Volatile的理解
Volatile是java虛擬機器器提供的輕量級的同步機制
1、保證可見性
2、不保證原子性
3、禁止指令重排
什麼是JMM
JVM->java虛擬機器器
JMM->java記憶體模型,不存在的東西,概念!約定
關於JMM的一些同步的約定:
執行緒解鎖前,必須把共用變數立刻刷回主記憶體
執行緒加鎖前,必須讀取主記憶體中的最小值到工作記憶體中!
必須要保證加鎖和解鎖時同一把鎖
執行緒------->工作記憶體、主記憶體
詳見:Java記憶體模型(JMM)詳解 - 程式新視界 - 部落格園 (cnblogs.com)
在此互動過程中,Java記憶體模型定義了8種操作來完成,虛擬機器器實現必須保證每一種操作都是原子的、不可再拆分的(double和long型別例外)。
Java記憶體模型還規定了在執行上述8中基本操作時必須滿足如下規則。
模擬主記憶體中資料被修改後未能獲取到最新資料的子執行緒的工作記憶體狀態
package org.example.tvolatile;
import java.util.concurrent.TimeUnit;
public class JMMDemo01 {
//定義變數
private static Integer num = 0;
public static void main(String[] args) throws InterruptedException {
new Thread(()->{
//只要num=0就一直迴圈,來模擬主執行緒資料被改變後子執行緒的狀態
while (num==0){
}
System.out.println("子執行緒執行結束,num已經不等於0了");
}).start();
//休眠疫苗等待子執行緒開啟
TimeUnit.SECONDS.sleep(1);
//修改值
num=1;
System.out.println(num);
}
}
結果就是當主記憶體中的值已經被改變了,但是子執行緒中的工作記憶體不知道,所以還在一直迴圈
程式一直沒有結束!
問題:子執行緒中的工作記憶體不知道主記憶體的值已經被修改過了
------------------>引出Volatile,Volatile就能解決這個問題