執行緒如何同步和通訊

2022-06-30 22:15:12 字數 1257 閱讀 5556

執行緒同步

什麼是執行緒同步?

執行緒同步的真實意思恰好相反,其實是「排隊」。當使用多個執行緒來訪問同乙個資料時,非常容易出現執行緒安全問題(比如多個執行緒都在操作同一資料導致資料不一致),所以我們用同步機制來解決這些問題。

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

同步**塊:

synchronized(同乙個資料/鎖){} 同乙個資料:就是n條執行緒同時訪問乙個資料。

同步方法:

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

同步方法的同步監視器(鎖)是 this 也就是該物件的本身通過使用同步方法,可非常方便的將某類變成執行緒安全的類。

執行緒安全的類:

這個類的物件可以同時被多個執行緒安全的訪問。

每個執行緒都能正常的執行原子操作,得到正確的結果。

在每個執行緒的原子操作都完成後,物件處於邏輯上合理的狀態。

注意:synchronized關鍵字可以修飾方法,也可以修飾**塊,但不能修飾構造器,屬性等。實現同步機制注意以下幾點: 安全性高,效能低,在多執行緒用。效能高,安全性低,在單執行緒用。

執行緒通訊:

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

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

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

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

notify():喚醒在同步監視器上等待的單個執行緒

notifyall()方法:喚醒在同步監視器上等待的單個執行緒

同步鎖線程同步的基本實現思路還是比較容易理解的。我們可以給共享資源加一把鎖,這把鎖只有一把鑰匙。哪個執行緒獲取了這把鑰匙,才有權利訪問該共享資源。

但是,現代的程式語言的設計思路都是把同步鎖加在**段上。確切的說,是把同步鎖加在「訪問共享資源的**段」上。這一點一定要記住,同步鎖是加在**段上的。

public static final object lock1 = new object(); 

… f1()

}

執行緒同步通訊

package itcast.thread public class traditionalthreadcommunication start for int i 1 i 50 i public class business catch interruptedexception e for int ...

執行緒同步通訊

看傳智播客張孝祥講的乙個例子。子執行緒迴圈10次,接著主線程迴圈100次,再次回到子執行緒迴圈10次,接著再回到主線程迴圈100次,如此迴圈50次,請寫出程式。package cn.itcast.heima2 public class traditionalthreadcommunication s...

RT THREAD執行緒的同步和通訊

一 執行緒同步 訊號量,互斥量,事件集 訊號量 任何執行緒都可釋放,已經不存在例項,執行緒遞迴持有會發生主動掛起 最終形成死鎖 優先順序反轉 生成者 執行緒1 共享資料 臨界區 消費者 執行緒2 模型中對共享資料的操作 對spi匯流排的占有操作要互斥 對臨界區的保護rt hw interrupt d...