java 多執行緒同步
執行緒屬性:
1.執行緒優先順序,
優先順序高度依賴於系統,不要讓程式的正確性依賴於優先順序。預設情況子執行緒會繼承父執行緒的優先順序。
2.守護執行緒,
唯一用途是為其他執行緒提供服務,當只剩下守護執行緒時,虛擬機器就退出了。守護執行緒應該永遠不 訪問固有資源,如檔案、資料庫,因為會在任何時候發生中斷。
3.未捕獲異常處理,
執行緒的run方法不能丟擲任何受檢查異常,非受檢查異常會導致執行緒終止,但是不需要catch處理,這類異常線上程死亡前,會被傳遞到一個用於未捕獲異常的處理器。
如果不安裝預設處理器,預設處理器為空,出現異常時,會使用對應的ThreadGroup物件作為處理器。
4.執行緒組,
是一個可以統一管理的執行緒集合,預設情況,建立的所有執行緒屬於相同的執行緒組。建議不要使用執行緒組,使用執行緒集合。
併發處理的要求:
同步
鎖
RentranLock類,鎖機制是最常用的同步方式,確保任何時刻只有一個執行緒進入臨界區
- 把解鎖操作放在finally子句之內,保證最後可以將鎖釋放。
- 不要使用帶資源的try語句(try-with-resources),因為帶資源的try語句的宣告中需要new新的資源物件,鎖將無法起作用。
- 鎖是可重入的,持有計數器(hold count)會跟蹤巢狀,因此被鎖保護的程式碼可以呼叫另一個使用相同鎖的方法。
- 條件等待,條件Condition類,當不滿足條件時,呼叫await()方法進入該條件的等待集,當有其他方法呼叫該條件的signalAll()方法時,會啟用等待該條件的所有執行緒。signalAll不會立即啟用等待執行緒,只是解除其阻塞狀態,可以被呼叫。singal方法是隨機解除某個執行緒的阻塞狀態,被解鎖的執行緒依然有可能無法使用。
synchronized關鍵字
可以用於修飾物件方法、類方法,相當於自動加鎖。
public synchronized void method()
{
do something;
}
等價於
public void method()
{
this.intrinsicLock.lock();
try
{
do something;
}
finally
{
this.intrinsicLock.unLock();
}
}
synchronized使用了物件的內部鎖,並且該鎖有一個內部條件。由鎖管理試圖進入synchronized方法的執行緒,由條件來管理呼叫wait的執行緒。
內部鎖和條件侷限:
- 不能中斷一個正在試圖獲得鎖的執行緒。
- 試圖獲得鎖時不能設定超時。
- 每個鎖僅有一個單一條件,可能不夠。
Volatile域
被宣告為volatile的域,編譯器和虛擬機器就會知道該域可能被另一個執行緒併發更新。提供了物件的可見性,但是不能提供原子性。
這種機制可以不通過鎖的方式,保證更新物件的可見性。
final變數
final變數修飾的域,需要在建構函式完成後才會被讀到,保證了其他執行緒看到的都相同。
Atomic類
執行緒安全的集合和物件