1. 程式人生 > >java 多執行緒同步

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類

執行緒安全的集合和物件