關於java實現同步的方法

技術小哥哥發表於2017-11-07

什麼是執行緒同步? 

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

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

1。

同步程式碼塊: 

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

2。 

同步方法: 

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

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

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

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

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

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

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

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

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

 

執行緒通訊: 

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

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

Java.lang.object 裡的三個方法wait() notify() notifyAll() 

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

wait(mills)方法 

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

notify() 

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

notifyAll()方法 

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

本文轉自SummerChill部落格園部落格,原文連結:http://www.cnblogs.com/DreamDrive/p/4093723.html,如需轉載請自行聯絡原作者


相關文章