java記憶體模型與執行緒(2)
一、原子性、可見性與有序性
1.原子性
原子性操作包括read、load、asign、use、store和write
更大範圍的原子性保證:lock和unlock(倆者未開放),monitorenter和monitorexit(隱式的使用synchronized)
2.可見性
變數修改後將新值同步回主記憶體
volatile、synchronize、final都能保證
3.有序性
有序性---序列
無序性----並行,重排序
volitile和synchronized保證執行緒之間操作的有序性
備註:使用volatile的前提條件
a.運算結果並不依賴變數的當前值,或者能夠確保只有單一的執行緒修改變數的值
b.變數不需要與其他的狀態變數共同參與不變約束
二、先行發生原則
先行發生就是一種偏序關係
程式次序規則:一個執行緒內 控制流順序,書寫在前面的操作先行發生在書寫後面的操作。
管程鎖定規則:一個unlock操作先行發生於後面對同一個鎖的lock操作,必須強調的是同一個鎖,而後面是指時間上的先後順序
volatile變數規則:對一個volatile變數的寫操作先行與這個變數的讀操作
執行緒啟動規則:Thread物件的start()方法先行發生於此執行緒的每一個動作
執行緒終止規則:執行緒中的所有操作都先行發生於對此執行緒的終止檢測,可以通過Thread.join()方法結束,Thread.isAlive()的返回值檢測執行緒已經終止執行
執行緒中斷規則:對執行緒interrupt()方法的呼叫先行發生於被中斷執行緒的程式碼檢測中斷事件的發生,可以通過Thread.interrupted()方法檢測到是否有中斷髮生
物件終結規則:一個物件的初始化完成先行於他的finalize()方法的開始
傳遞性:如果操作A先行於操作B,操作B先行於操作C,那操作A先行於操作C
三、java與執行緒
1.執行緒的實現方式
執行緒是是CUP排程的基本單位
在java API中,一個Native方法往往意味著這個方法沒有使用或者無法使用平臺無關的手段來實現
方式一:核心執行緒
直接由作業系統核心支援的執行緒,這種執行緒由核心完成執行緒切換,核心通過操縱排程器對執行緒進行排程,並負責將執行緒的任務對映到各個處理器上。
輕量級程序與核心1:1關係
方式二:使用者執行緒
廣義上講:一個執行緒不是核心執行緒就是使用者執行緒
狹義上講:指完全建立在使用者空間的執行緒庫上
程序與使用者執行緒1:N關係
方式三:使用者執行緒加輕量級程序混合實現
程序與執行緒N:M關係
2.java執行緒實現
一對一的執行緒模型實現
3.執行緒的排程
排程方式:協同式執行緒排程和搶佔式執行緒排程
java使用搶佔式執行緒排程
執行緒的優先順序,但是不靠譜,因為沒有和系統的執行緒優先順序一一對應