Java記憶體模型
主記憶體與工作記憶體:
java記憶體模型規定了所有的變數都在主記憶體中,每個執行緒還有自己的工作記憶體。
工作記憶體中保存了該執行緒使用的主記憶體副本拷貝,執行緒對變數的所有操作都必須在工作記憶體中進行。
內存間互動操作:
1 lock 作用於主記憶體的變量,它把一個變數標識為一個執行緒獨佔的狀態。
2 unlock 作用於主內存的變量,把鎖定的變量釋放出來
3 read 作用於工作內存的變量,把一個變量的值從主內存傳輸到線程的工作內存中。
4 load 作用於工作記憶體的變量,它把read操作從主記憶體中得到的變數值放入工作記憶體的變數副本
5 use 作用於工作記憶體的變數
5 use 作用於工作記憶體的變數把工作記憶體中一個變數的值傳遞給執行引擎 6 assign 作用於工作內存的變量, 把一個從執行引擎收到的值賦給工作內存的變量 7 store 作用天工作內存的變量,把工作內存中一個變量的值傳送到內存內存中一個變量主內存中。 8 write 作用於主記憶體的變量,把store操作從工作記憶體中得到的變數的值放入主記憶體 當一個變數定義為volatile後,它將具備兩種特性當一個變數定義為volatile後,它將具備兩種特性🀜🀜『1 保證此變量對所有執行緒的可見性,對於非原子性的操作,仍然不是執行緒安全的。
2 禁止指令重新排序最佳化。
原子性、可見性與有序性
先行先發原則
Java執行緒的狀態轉換
New 建立後沿未啟動的純種處於此作業系統的狀態轉換
New 建立後沿未啟動的純種處於此作業系統中的Running和Ready,處於此狀態的執行緒有可能正在執行,也有可能正在等等著CPU為它分配執行時間
無限期等待Waiting 處於這種狀態的執行緒不會被分配CPU執行時間,它們要等待被其它執行緒明確地喚醒:沒有設定Timeout參數的Object.wait()方法;沒有設定Timeout參數的Thread.join()方法;LockSupport.park()方法
限期等待Timed Waiting 處於這種狀態的執行緒也不會被指派CPU執行時間,不過無須等待被期它執行緒明確地喚醒,在一定時間後它們會由系統自動喚醒: Thread.sleep()方法;設定了Timeout參數的Object.wait()方法;設定了Thimeout參數的Thread.join()方法;LockSupport.parkNanos()方法;LockSuport.parkUnitl()方法
阻塞Blocked 等待著取得到一個排他執行緒的線程