1、臨界區(critical section):通過對多執行緒的序列化來訪問公共資源或一段**,速度快,適合控制資料訪問。
優點:保證在某一時刻只有乙個執行緒能訪問資料的簡便辦法
缺點:雖然臨界區同步速度很快,但卻只能用來同步本程序內的執行緒,而不可用來同步多個程序中的執行緒。
2、互斥量(mutex):為協調共同對乙個共享資源的單獨訪問而設計的。
互斥量跟臨界區很相似,比臨界區複雜,互斥物件只有乙個,只有擁有互斥物件的執行緒才具有訪問資源的許可權。
優點:使用互斥不僅僅能夠在同一應用程式不同執行緒中實現資源的安全共享,而且可以在不同應用程式的執行緒之間實現對資源的安全共享。
缺點:①互斥量是可以命名的,也就是說它可以跨越程序使用,所以建立互斥量需要的資源更多,所以如果只為了在程序內部是用的話使用臨界區會帶來速度上的優勢並能夠減少資源佔用量。因為互斥量是跨程序的互斥量一旦被建立,就可以通過名字開啟它。
②通過互斥量可以指定資源被獨佔的方式使用,但如果有下面一種情況通過互斥量就無法處理,比如現在一位使用者購買了乙份三個併發訪問許可的資料庫系統,可以根據使用者購買的訪問許可數量來決定有多少個執行緒/程序能同時進行資料庫操作,這時候如果利用互斥量就沒有辦法完成這個要求,訊號量物件可以說是一種資源計數器。
3、訊號量(semaphore):為控制乙個具有有限數量使用者資源而設計。它允許多個執行緒在同一時刻訪問同一資源,但是需要限制在同一時刻訪問此資源的最大執行緒數目。互斥量是訊號量的一種特殊情況,當訊號量的最大資源數=1就是互斥量了。
優點:適用於對socket(套接字)程式中線程的同步。(例如,網路上的http伺服器要對同一時間內訪問同一頁面的使用者數加以限制,只有不大於設定的最大使用者數目的執行緒能夠進行訪問,而其他的訪問企圖則被掛起,只有在有使用者退出對此頁面的訪問後才有可能進入。)
缺點:①訊號量機制必須有公共記憶體,不能用於分布式作業系統,這是它最大的弱點;
②訊號量機制功能強大,但使用時對訊號量的操作分散, 而且難以控制,讀寫和維護都很困難,加重了程式設計師的編碼負擔;
③核心操作p-v分散在各使用者程式的**中,不易控制和管理,一旦錯誤,後果嚴重,且不易發現和糾正。
4、事件(event): 用來通知執行緒有一些事件已發生,從而啟動後繼任務的開始。
優點:事件物件通過通知操作的方式來保持執行緒的同步,並且可以實現不同程序中的執行緒同步操作。
缺點:總結:
①臨界區不是核心物件,只能用於程序內部的執行緒同步,是使用者方式的同步。互斥、訊號量是核心物件可以用於不同程序之間的執行緒同步(跨程序同步)。
②互斥其實是訊號量的一種特殊形式。互斥可以保證在某一時刻只有乙個執行緒可以擁有臨界資源。訊號量可以保證在某一時刻有指定數目的執行緒可以擁有臨界資源。
筆記 執行緒同步 基礎 四種同步方式
執行緒同步的概念 多個執行緒操作同一共享資源 在linux裡面建議鎖 執行緒同步的條件 1 共享資源 2 競爭關係 3 多個物件沒有同步的機制 3互斥量 mutext 1 初始化 2 lock枷鎖 3 unlock解鎖 4死鎖 第一種 對同乙個互斥量枷鎖兩次 第二種 兩個資源,乙個執行緒需要同時拿到...
多執行緒同步的四種方式 事件物件
問題的引入 模仿12306多人同時搶票。解決方法 使用事件物件。事件物件也屬於核心物件,包含乙個使用計數,乙個用於指明該事件是乙個自動o重置的事件還是乙個人工重置的事件的布林值,另乙個用於指明該事件處於已通知狀態還是未通知狀態的布林值。有兩種不同型別的事件物件。一種是人工重置的事件,另一種是自動重置...
建立執行緒的四種方式
1.繼承於thread類,重寫run 方法 2.實現runable介面,實現裡面的run 方法 前兩種不用多說 3.使用 futuretask 實現有返回結果的執行緒,可以返回執行緒執行結果 public class test class mycallable implements callable...