1)執行緒安全與非執行緒安全
非執行緒安全是當多個執行緒訪問同乙個物件彙總的成員變數時產生的,產生的後果就是髒讀,就是指讀到的資料是被更改過的。而執行緒安全就是對獲取成員變數的值經過同步處理,不會再出現髒讀的現象。
2)執行緒不安全的產生條件
a.存在多個執行緒
b.多個執行緒共享同乙個資源
c.對共享資源進行非原子性操作
3)執行緒安全的特徵
public
class
localvariable
}class
localvaribleservice
catch
(interruptedexception e)
}elseif(
"b".
equals
(name)
)catch
(interruptedexception e)
} system.out.
println
("名稱為"
+ name +
"的num值為"
+ num);}
}class
localvariblethreada
extends
thread
@override
public
void
run()}
class
localvariblethreadb
extends
thread
@override
public
void
run(
)}
2.成員變數不是執行緒安全的,如果有兩個執行緒同時操作業務物件中的成員變數,可能會產生非執行緒安全問題。解決方法:在方法前使用關鍵字synchronized進行修飾。
樣例程式解釋:
public
class
membervariable
}class
membervaribleservice
catch
(interruptedexception e)
}elseif(
"b".
equals
(name)
)catch
(interruptedexception e)
} system.out.
println
("名稱為"
+ name +
"的num值為"
+ num);}
}class
membervariblethreada
extends
thread
@override
public
void
run()}
class
membervariblethreadb
extends
thread
@override
public
void
run(
)}
1)鎖的分類
多執行緒程式設計同步時有可能會用到鎖,可以分為內建鎖(sychronized)和顯示鎖(例如reentrantlock)
2)內建鎖的物件鎖
1、sychronized 作用於例項方法時,鎖物件是this,也就是所在類的例項物件
2、sychronized 作用於靜態方法時,鎖物件是class物件
3、sychronized 作用於**塊時,鎖物件是sychronized(object)中的object
3)內建鎖的特性
a.內建鎖的互斥。內建鎖是乙個互斥鎖,不僅讀寫互斥並且讀讀也互斥,最多只有乙個執行緒能夠獲得該鎖,當執行緒a嘗試去獲得執行緒b持有的內建鎖時,執行緒a必須等待或者阻塞,直到執行緒b釋放這個鎖。
b.內建鎖是可重入鎖。如果已經獲取了乙個鎖物件,在還沒釋放時又要執行該鎖物件的另乙個**塊或方法,則不需要再次給這個物件加鎖就可以直接執行。
c.內建鎖自動釋放:在多執行緒中,當多個執行緒訪問同一物件時,當乙個執行緒先執行某synchronized關鍵字修飾的方法出現異常時,該執行緒持有的鎖會自動釋放,如果該異常沒有**獲或丟擲,則該執行緒停止執行,但是其他執行緒會繼續執行,因停止執行緒獲得的物件鎖被自動釋放,所以其他執行緒會獲得物件鎖。
d.內建鎖是非公平鎖。執行緒在競爭synchronized鎖時並不遵循先到等待佇列就先獲得鎖,如果乙個執行緒來請求鎖,剛好該鎖被釋放了,那麼這個執行緒可能會跳過在等待佇列中的其它執行緒直接獲得該鎖。
e. synchronized關鍵字不能繼承。父類方法中加了synchronized,在子類中覆蓋了這個方法,在子類中的這個方法預設情況下並不是同步的,需要重新加鎖。
4)內建鎖與顯示鎖的區別
a.鎖的釋放。內建鎖只要執行到同步**塊之外就會自動釋放鎖;而顯示鎖必須呼叫unlock方法才能釋放鎖。
b.公平性。內建鎖不可以選擇公平策略,只能是不公平鎖; 顯示鎖可以指定公平策略,預設為不公平鎖。
c.可中斷申請。 內建鎖不可中斷申請,在申請鎖時被其它執行緒持有,那麼當前執行緒後掛起,掛起期間不可中斷;顯示鎖提供可中斷申請,例如lock.lockinterruptibly(),在申請鎖的過程中如果當前執行緒被中斷, 將丟擲interruptedexception異常。
d.可嘗試申請、可定時早請。 內建鎖不提供這種特性;顯示鎖提供嘗試型申請方法,例如lock.trylock方法。
e.是否可以精確喚醒特定執行緒。內建鎖的notify或notifyall方法喚醒在其上等待的執行緒,但無法指定特定執行緒;顯示鎖可以通過condition物件(由顯示鎖派生出來),呼叫condition.singal或condition.singalall方法可以喚醒在該condition物件上等待的執行緒,以此來喚醒指定執行緒。
總結:內建鎖夠解決大部分需要的場景,當需要額外的靈活時才考慮顯示鎖,比如公平、可中斷、可嘗試、可定時、可喚醒特定執行緒等場景。
執行緒同步機制
本週主要學習 執行緒同步機制 互斥量 讀寫鎖和條件變數 和簡單程式的實現,對執行緒同步有了進一步認識 內容如下 執行緒的基本概念,相關函式 互斥量 說明 處於標圓形框之上的線段表示相關的執行緒沒有擁有互斥量 處於圓形框中心線之上的線段表示相關的執行緒等待互斥量 處於圓形框中心線之下的線段表示相關的執...
執行緒同步機制
執行緒同步主要用於協調對臨界資源的訪問,臨界資源可以是硬體裝置 比如印表機 磁碟 檔案 記憶體 變數 陣列 佇列等 執行緒同步有4種機制 他們的主要區別在於 各同步機制詳細的功能說明如下 臨界區臨界區是一段獨佔對某些共享資源訪問的 在任意時刻只允許乙個執行緒對共享資源進行訪問。如果有多個執行緒試圖同...
執行緒同步機制
執行緒同步的四種機制 主要區別在於 適用範圍 臨界區在使用者模式下,不會發生使用者態到核心態的切換,只能用於同程序內線程間同步。其他會導致使用者態到核心態的切換,利用核心物件實現,可用於不同程序間的執行緒同步。效能 臨界區效能較好,一般只需要數個cpu週期。其他機制效能相對較差,一般需要數十個cpu...