近日工作不是太忙,剛好有時間了解一些其他東西,本來打算今天上午去體檢,但是看看天氣還是明天再去吧,也有很大一個原因:就是周六沒有預約上!閑話少說,這裡簡單對鎖來個簡單介紹分享。
第一部分:什麼是鎖
第二部分:鎖的分類
第三部分:鎖的作用
第四部分: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>