標籤:允許 final mon 問題: 可重新進入 long and 資源 預設
安全執行緒的實現方法。
先來說說幾個概念:
1.同步:多線程並發訪問共用資料的時候,保證共用資料在同一時刻只能被一個(一些,使用訊號量時)線程使用。
2.臨界區:每個進程中訪問臨界資源的那段代碼。
3.臨界資源:每次僅允許一個進程訪問的資源。
4.訊號量:相當於一個計數器,每當一個進程使用一個資源,訊號量-1;進程釋放一個資源,訊號量+1;當訊號量為0時,進程無法使用該資源。
5.互斥量:訊號量的大小為1的情況下,僅有0和1兩個值。
一、互斥->同步,在java中的實現方式有synchronized關鍵字,java.util.concurrent包下的重入鎖ReentrantLock。
a.synchronized關鍵字,利用monitorenter和monitorexit這兩個位元組碼指令,這兩個位元組碼指令都需要一個reference型別參數指明鎖定和解鎖的對象,而且對於同一條線程來說,同 步塊是可重新進入的,在持有鎖線程未執行完之前,其他嘗試擷取鎖的線程阻塞。
b.在功能上很相似,但是在代碼寫法上,表現為API層面上的互斥鎖(lock()和unlock()配合try/finally語句塊來完成),並且增加了進階功能:
①等待可中斷,持有鎖的線程長期不釋放鎖,等待的線程可以選擇放棄等待。
②可以再構造方法上設定true,實現公平鎖,預設非公平鎖。
③鎖可以綁定多個條件,一個ReentrantLock對象可以綁定多個Condition對象。
註:jdk1.5之前在隨著線程數量增多,synchronized效能下降嚴重,1.6之後效能大約一致。其主要問題是線程阻塞和喚醒所帶來的效能問題。
二、非阻塞->同步,採用開放式並行存取策略,先對共用變數進行操作,如果沒有其他線程爭用,則操作成功;否則,採用其他補償措施。
依賴與硬體:操作和衝突檢測兩個步驟具有原子性。
java1.5後操作有sun.misc.unsafe類中的compareAndSwapInt()和compareAndSwapLong()提供,這個只能有Bootstrap ClassLoader載入,可以同過juc中的atomicInt類來間接調用。
但可能會發生“ABA”問題,但一般不會對程式結果產生影響。
註:“ABA”問題:在程式取值期間另一個線程更改又改回,線程無法判斷。
三、volitile 寫累了,待會再寫。
java線程同步