iOS中加資料鎖的方式

2021-07-09 09:57:44 字數 2666 閱讀 3428

多執行緒中資源的使用問題有時會出現極大的問題,尤其修改值的時候,這就引入了鎖的機制。

了解ios的幾種鎖的基本形式;下面幾個還未用過因此也只是簡單提下,後續再完善!

1.@synchronized(id object)(最簡單的方法) 會自動對引數物件加鎖。

作用是建立乙個互斥鎖,保證此時沒有其它執行緒對self物件進行修改。

這個是objective-c的乙個鎖定令牌,防止self物件在同一時間內被其它執行緒訪問,起到執行緒保護作用。一般在公用變數的時候使用,如單例模式或操作類的static變數中使用。

@synchronized(self)
2.nslock

nslock物件實現了nslocakingprotocol,包含幾個方法:

lock:加鎖

unlock:解鎖

trylock:嘗試加鎖,如果失敗了,並不會阻塞執行緒,只是立即返回no

lockbeforedate:在指定的date之前暫時阻塞執行緒(如果沒有獲取鎖的話),如果到期還沒有獲取鎖,則執行緒被喚醒,函式立即返回no

nslock *lock = [[nslock alloc] init];

dispatch_async(dispatch_get_global_queue(dispatch_queue_priority_default, 0), ^);

dispatch_async(dispatch_get_global_queue(dispatch_queue_priority_default, 0), ^);

nslock *lock = [[nslock alloc] init];

dispatch_async(dispatch_get_global_queue(dispatch_queue_priority_default, 0), ^

});

原理解析 :同乙個lock物件,如果在乙個執行緒中鎖定了,那麼只有解鎖後才會在下乙個執行緒中執行,如果不解鎖便一直不會執行了。

trylock則是嘗試進行加鎖,如果成功才會鎖定。

3.nsrecursivelock遞迴鎖

nsrecursivelock,多次呼叫不會阻塞已獲取該鎖的執行緒【在同乙個執行緒內不會被阻塞,但在其他執行緒就相當於普通的互斥鎖】

4.nsconditionlock條件鎖

nsconditionlock,條件鎖,可以設定條件

相關知識點:

1. 一旦乙個執行緒獲得鎖,其他執行緒一定等待

2.[*** lock];表示*期待獲得鎖,如果沒有其他執行緒獲得鎖(不需要判斷內部的condition)那它能執行此行以下**,如果已經有其他執行緒獲得鎖(可能是條件鎖,或者無條件鎖),則等待,直至其他執行緒解鎖。

3.[*** lockwhencondition:a條件];如果沒有其他執行緒獲得該鎖,但是該鎖內部的condition不等於a條件,它依然不能獲得鎖,仍然等待。如果內部的condition等於a條件,並且沒有其他執行緒獲得該鎖,則進入**區,同時設定它獲得該鎖,其他任何執行緒都將等待它**的完成,直至它解鎖。

4.[*** unlockwithcondition:a條件];表示釋放鎖,同時把內部的condition設定為a條件

5.return = [*** lockwhencondition:a條件 beforedate:a時間];表示如果被鎖定(沒獲得鎖),並超過該時間則不再阻塞執行緒。但是注意:返回的值是no,它沒有改變鎖的狀態,這個函式的目的在於可以實現兩種狀態下的處理。

6. 所謂的condition就是整數,內部通過整數比較條件

5.nsdistributedlock分布鎖

nsdistributedlock,分布鎖,檔案方式實現,可以跨程序 用trylock方法獲取鎖。 用unlock方法釋放鎖。 如果乙個獲取鎖的進行在釋放鎖之前掛了,那麼鎖就一直得不到釋放了,此時可以通過breaklock強行獲取鎖。

Mysql 增加資料的幾種方式

mysql 增加資料的幾種方式 set insert into tab name set col 1 value 1 一次性插入多個 insert into tab name col 1,col 2 values value 1a value 1b value 2a value 2b 插入時有主鍵衝...

ios 資料儲存方式

今天發現一篇好文章,忍不住收藏下來 所謂的持久化,就是將資料儲存到硬碟中,使得在應用程式或機器重啟後可以繼續訪問之前儲存的資料。在ios開發中,有很多資料持久化的方案,接下來我將嘗試著介紹一下5種方案 在介紹各種儲存方法之前,有必要說明以下沙盒機制。ios程式預設情況下只能訪問程式自己的目錄,這個目...

hive部分 hive表中載入資料的方式(四種)

注意 hive不支援insert into table values 的插入資料 hive表中載入資料的四種方式 1.從本地載入資料 hive hive create table wyp id int,name string,age int,tel string row format delimit...