1. 程式人生 > >iOS 多執行緒中的鎖

iOS 多執行緒中的鎖

鎖的分類以及簡單介紹

一. 鎖的分類

  • 互斥鎖
    互斥鎖是一種訊號量,一次只允許訪問一個執行緒。如果正在使用互斥鎖並且另一個執行緒試圖獲取它,則該執行緒將阻塞,直到互斥鎖被其原始持有者釋放。如果多個執行緒競爭相同的互斥鎖,則一次只允許一個互斥鎖訪問它。
  • 遞迴鎖定(也是互斥鎖)
    遞迴鎖是互斥鎖的變體。遞迴鎖允許單個執行緒在釋放之前多次獲取鎖。其他執行緒保持阻塞狀態,直到鎖的所有者釋放鎖的次數與獲取鎖的次數相同。在遞迴迭代期間主要使用遞迴鎖,但也可以在多個方法分別需要獲取鎖的情況下使用遞迴鎖。
  • 讀寫鎖定(共享獨佔鎖)
    讀寫鎖也稱為共享獨佔鎖。這種型別的鎖通常用於大規模操作,並且如果經常讀取受保護的資料結構並且僅偶爾修改,則可以顯著提高效能。在正常操作期間,多個讀取器可以同時訪問資料結構。但是,當執行緒想要寫入結構時,它會阻塞,直到所有讀取器釋放鎖定,此時它獲取鎖定並可以更新結構。當寫入執行緒正在等待鎖定時,新的讀取器執行緒會阻塞,直到寫入執行緒完成。系統僅支援使用POSIX執行緒的讀寫鎖。(pthread)
  • 分散式鎖
    分散式鎖提供程序級別的互斥訪問。與真正的互斥鎖不同,分散式鎖定不會阻止程序或阻止程序執行。它只是報告鎖何時繁忙,並讓流程決定如何繼續。
  • 自旋鎖
    自旋鎖重複輪詢其鎖定條件,直到該條件成立為止。自旋鎖最常用於多處理器系統,其中鎖的預期等待時間很短。在這些情況下,輪詢通常比阻塞執行緒更有效,這涉及上下文切換和執行緒資料結構的更新。由於其輪詢性質,系統不提供任何旋轉鎖的實現,但您=可以在特定情況下實現。
  • 雙重鎖定
    雙重檢查鎖是嘗試通過在鎖定之前測試鎖定標準來減少鎖定的開銷。由於雙重檢查的鎖可能不安全,因此係統不會為它們提供明確的支援,因此不鼓勵使用它們。
    二. 使用鎖
    1.使用@synchronized指令
    該@synchronized指令是在Objective-C程式碼中動態建立互斥鎖的便捷方式。該@synchronized指令執行任何其他互斥鎖將執行的操作 - 它可以防止不同的執行緒同時獲取相同的鎖,在這種情況下,您不必直接建立互斥鎖或鎖定物件。相反,您只需使用任何Objective-C物件作為鎖定標記.
@synchronized(anObj)
    {
        //大括號之間的所有內容都受@synchronized指令保護。
    }

傳遞給@synchronized指令的物件是用於區分受保護塊的唯一識別符號。如果在兩個不同的執行緒中執行上述方法,則anObj在每個執行緒上為引數傳遞一個不同的物件,每個執行緒都會鎖定並繼續處理,而不會被另一個阻塞。但是,如果在兩種情況下都傳遞相同的物件,則其中一個執行緒將首先獲取鎖定,另一個執行緒將阻塞,直到第一個執行緒完成關鍵部分。
作為預防措施,該@synchronized塊隱式地向受保護程式碼新增異常處理程式。如果丟擲異常,此處理程式會自動釋放互斥鎖。這意味著為了使用該@synchronized指令,還必須在程式碼中啟用Objective-C異常處理。