天天看點

談談iOS中的鎖

近日工作不是太忙,剛好有時間了解一些其他東西,本來打算今天上午去體檢,但是看看天氣還是明天再去吧,也有很大一個原因:就是周六沒有預約上!閑話少說,這裡簡單對鎖來個簡單介紹分享。

第一部分:什麼是鎖

第二部分:鎖的分類

第三部分:鎖的作用

第四部分:ios中鎖的實作

從小就知道鎖,就是家裡門上的那個鎖,用來防止盜竊的鎖。它還有鑰匙,用于開鎖。不過這裡的鎖,并不是小時候認知的鎖,而是站在程式員的角度的鎖。這裡我就按照我的了解來介紹一下鎖。

在計算機科學中,鎖是一種同步機制,用于在存在多線程的環境中實施對資源的通路限制。你可以了解成它用于排除并發的一種政策。看例子

上面這段代碼并不能保證這個任務有個鎖,是以它可以在同一時間被多個任務執行。這個時候就有可能多個任務都檢測到lock是空閑的,是以兩個或者多個任務都将嘗試設定lock,而不知道其他的任務也在嘗試設定lock。這個時候就會出問題了。

再看看這段代碼:

這樣就能防止多個任務去修改val了,(這裡注意,如果val是public的,那個也會導緻一些問題)。

鎖根據不同的性質可以分成不同的類。

在wikipedia介紹中,一般的鎖都是建議鎖,也就四每個任務去通路公共資源的時候,都需要取得鎖的資訊,再根據鎖資訊來确定是否可以存取。若存取對應資訊,鎖的狀态會改變為鎖定,是以其他線程不會通路該資源,當結束通路時,鎖會釋放,允許其他任務通路。有些系統有強制鎖,若未經授權的鎖通路鎖定的資料,在通路時就會産生異常。

在ios中,鎖分為遞歸鎖、條件鎖、分布式鎖、一般鎖(這裡是看着nslock類裡面的分類劃分的)。

對于資料庫的鎖分類:

分類方式

分類

按鎖的粒度劃分

表級鎖、行級鎖、頁級鎖

按鎖的級别劃分

共享鎖、排他鎖

按加鎖方式劃分

自動鎖、顯示鎖

按鎖的使用方式劃分

樂觀鎖、悲觀鎖

按操作劃分

dml鎖、ddl鎖

這裡就不在詳細介紹了,感興趣的大家可以自己查閱相關資料。

這個比較通俗來講:就是為了防止在多線程(多任務)的情況下對共享資源(臨界資源)的髒讀或者髒寫。也可以了解為:執行多線程時用于強行限制資源通路的同步機制,即并發控制中保證互斥的要求。

先看看ios中nslock類的.h檔案。這裡就不在寫上來了。從代碼中可以看出,該類分成了幾個子類:nslock、nsconditionlock、nsrecursivelock以及nscondition。然後有一個nslocking的協定:

這幾個子類都遵循了nslock的協定,這裡簡單介紹一下其中的幾個方法:

對于trylock方法,嘗試擷取一個鎖,并且立刻傳回bool值,yes表示擷取了鎖,no表示沒有擷取鎖失敗。 lockbeforedate:方法,在某個時刻之前擷取鎖,如果擷取成功,則傳回yes,no表示擷取鎖失敗。接下來就讓我們看一下ios中實作鎖的方式:

方式1 使用nslock類

方式2 使用@synchorize

對于@synchorize指令中使用的testlock為該鎖标示,隻有标示相同的時候才滿足鎖的效果。它的優點是不用顯式地建立鎖,便可以實作鎖的機制。但是它會隐式地添加異常處理程式來保護代碼,該程式在抛出異常的時候自動釋放鎖。

方式3 使用gcd

方式4 使用phtread

pthread_mutex_t定義在pthread.h,是以記得#include。

這裡還測試了osspinlock(此類已經被os_unfair_lock所替代)。結果如下:

synthorize > nslock > pthread > gcd > os_unfair_lock >osspinlock

這裡:

synthorize内部會添加異常處理,是以耗時。

pthread_mutex底層api,處理能力不錯。

gcd系統封裝的c代碼效果比pthread好。

簡單就介紹這麼多。

<a href="http://www.liuhaihua.cn/archives/220300.html">http://www.liuhaihua.cn/archives/220300.html</a>

<a href="https://zh.wikipedia.org/zh-hans/%e9%94%81_(%e8%ae%a1%e7%ae%97%e6%9c%ba%e7%a7%91%e5%ad%a6)">https://zh.wikipedia.org/zh-hans/%e9%94%81_(%e8%ae%a1%e7%ae%97%e6%9c%ba%e7%a7%91%e5%ad%a6)</a>

<a href="https://en.wikipedia.org/wiki/lock_(computer_science)">https://en.wikipedia.org/wiki/lock_(computer_science)</a>

繼續閱讀