當前位置:才華齋>計算機>java語言>

關於java實現執行緒同步的方式有哪些

java語言 閱讀(1.1W)

當使用多個執行緒來訪問同一個資料時,非常容易出現執行緒安全問題,所以我們用同步機制來解決這些問題。那麼,java實現執行緒同步的方式有哪些?下面本站小編帶大家一起來看看詳細內容,希望對大家有所幫助!想了解更多相關資訊請持續關注我們應屆畢業生考試網!

關於java實現執行緒同步的方式有哪些

  什麼是執行緒同步?

當使用多個執行緒來訪問同一個資料時,非常容易出現執行緒安全問題(比如多個執行緒都在操作同一資料導致資料不一致),所以我們用同步機制來解決這些問題。

  實現同步機制有兩個方法:

  1。同步程式碼塊:

synchronized(同一個資料){} 同一個資料:就是N條執行緒同時訪問一個數據。

  2。同步方法:

public synchronized 資料返回型別 方法名(){}

就是使用 synchronized 來修飾某個方法,則該方法稱為同步方法。對於同步方法而言,無需顯示指定同步監視器,同步方法的同步監視器是 this 也就是該物件的本身(這裡指的物件本身有點含糊,其實就是呼叫該同步方法的物件)通過使用同步方法,可非常方便的將某類變成執行緒安全的類,具有如下特徵:

1,該類的物件可以被多個執行緒安全的訪問。

2,每個執行緒呼叫該物件的任意方法之後,都將得到正確的結果。

3,每個執行緒呼叫該物件的任意方法之後,該物件狀態依然保持合理狀態。

注:synchronized關鍵字可以修飾方法,也可以修飾程式碼塊,但不能修飾構造器,屬性等。

實現同步機制注意以下幾點: 安全性高,效能低,在多執行緒用。效能高,安全性低,在單執行緒用。

1,不要對執行緒安全類的所有方法都進行同步,只對那些會改變共享資源方法的進行同步。

2,如果可變類有兩種執行環境,當執行緒環境和多執行緒環境則應該為該可變類提供兩種版本:執行緒安全版本和執行緒不安全版本(沒有同步方法和同步塊)。在單執行緒中環境中,使用執行緒不安全版本以保證效能,在多執行緒中使用執行緒安全版本.

  執行緒通訊:

  為什麼要使用執行緒通訊?

當使用synchronized 來修飾某個共享資源時(分同步程式碼塊和同步方法兩種情況),當某個執行緒獲得共享資源的鎖後就可以執行相應的程式碼段,直到該執行緒執行完該程式碼段後才釋放對該 共享資源的鎖,讓其他執行緒有機會執行對該共享資源的修改。當某個執行緒佔有某個共享資源的鎖時,如果另外一個執行緒也想獲得這把鎖執行就需要使用wait() 和notify()/notifyAll()方法來進行執行緒通訊了。

  ct 裡的三個方法:wait() notify() notifyAll()

wait方法導致當前執行緒等待,直到其他執行緒呼叫同步監視器的`notify方法或notifyAll方法來喚醒該執行緒。

  wait(mills)方法

都是等待指定時間後自動甦醒,呼叫wait方法的當前執行緒會釋放該同步監視器的鎖定,可以不用notify或notifyAll方法把它喚醒。

  notify()

喚醒在同步監視器上等待的單個執行緒,如果所有執行緒都在同步監視器上等待,則會選擇喚醒其中一個執行緒,選擇是任意性的,只有當前執行緒放棄對該同步監視器的鎖定後,也就是使用wait方法後,才可以執行被喚醒的執行緒。

  notifyAll()方法

喚醒在同步監視器上等待的所有的執行緒。只用當前執行緒放棄對該同步監視器的鎖定後,才可以執行被喚醒的執行緒