多執行緒中資源的使用問題有時會出現極大的問題,尤其修改值的時候,這就引入了鎖的機制。
了解ios
的幾種鎖的基本形式;下面幾個還未用過因此也只是簡單提下,後續再完善!
1.@synchronized(id object)
(最簡單的方法) 會自動對引數物件加鎖。
作用是建立乙個互斥鎖,保證此時沒有其它執行緒對self物件進行修改。這個是
objective-c
的乙個鎖定令牌,防止self
物件在同一時間內被其它執行緒訪問,起到執行緒保護作用。一般在公用變數的時候使用,如單例模式或操作類的static
變數中使用。
@synchronized(self)
2.nslock
nslock
物件實現了nslocaking
protocol
,包含幾個方法:
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), ^
});
原理解析 :同乙個3.lock
物件,如果在乙個執行緒中鎖定了,那麼只有解鎖後才會在下乙個執行緒中執行,如果不解鎖便一直不會執行了。
trylock
則是嘗試進行加鎖,如果成功才會鎖定。
nsrecursivelock
遞迴鎖
nsrecursivelock,多次呼叫不會阻塞已獲取該鎖的執行緒【在同乙個執行緒內不會被阻塞,但在其他執行緒就相當於普通的互斥鎖】4.
nsconditionlock
條件鎖
5.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
就是整數,內部通過整數比較條件
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...