詳解iOS 多線程 鎖 互斥 同步
在iOS中有幾種方法來(lái)解決多線程訪問(wèn)同一個(gè)內(nèi)存地址的互斥同步問(wèn)題:
方法一,@synchronized(id anObject),(最簡(jiǎn)單的方法)
會(huì)自動(dòng)對(duì)參數(shù)對(duì)象加鎖,保證臨界區(qū)內(nèi)的代碼線程安全
@synchronized(self)
{
// 這段代碼對(duì)其他 @synchronized(self) 都是互斥的
// self 指向同一個(gè)對(duì)象
}
方法二,NSLock
NSLock對(duì)象實(shí)現(xiàn)了NSLocking protocol,包含幾個(gè)方法:
- lock,加鎖
- unlock,解鎖
- tryLock,嘗試加鎖,如果失敗了,并不會(huì)阻塞線程,只是立即返回NO
- lockBeforeDate:,在指定的date之前暫時(shí)阻塞線程(如果沒(méi)有獲取鎖的話),如果到期還沒(méi)有獲取鎖,則線程被喚醒,函數(shù)立即返回NO
比如:
NSLock *theLock = [[NSLock alloc] init];
if ([theLock lock])
{
//do something here
[theLock unlock];
}
方法三,NSRecursiveLock,遞歸鎖
NSRecursiveLock,多次調(diào)用不會(huì)阻塞已獲取該鎖的線程。
NSRecursiveLock *theLock = [[NSRecursiveLock alloc] init];
void MyRecursiveFunction(int value)
{
[theLock lock];
if (value != 0)
<span style="font-size:14px;"> </span>{
–value;
MyRecursiveFunction(value);
}
[theLock unlock];
}
MyRecursiveFunction(5);
方法四,NSConditionLock,條件鎖
NSConditionLock,條件鎖,可以設(shè)置條件
//公共部分
id condLock = [[NSConditionLock alloc] initWithCondition:NO_DATA];
//線程一,生產(chǎn)者
while(true) {
[condLock lockWhenCondition:NO_DATA];
//生產(chǎn)數(shù)據(jù)
[condLock unlockWithCondition:HAS_DATA];
}
//線程二,消費(fèi)者
while (true) {
[condLock lockWhenCondition:HAS_DATA];
//消費(fèi)
[condLock unlockWithCondition:NO_DATA];
}
方法五,NSDistributedLock,分布鎖
NSDistributedLock,分布鎖,文件方式實(shí)現(xiàn),可以跨進(jìn)程
- 用tryLock方法獲取鎖。
- 用unlock方法釋放鎖。
如果一個(gè)獲取鎖的進(jìn)程在釋放鎖之前掛了,那么鎖就一直得不到釋放了,此時(shí)可以通過(guò)breakLock強(qiáng)行獲取鎖。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
IOS?簡(jiǎn)單的本地json格式文件解析的實(shí)例詳解
這篇文章主要介紹了IOS?簡(jiǎn)單的本地json格式文件解析的實(shí)例詳解的相關(guān)資料,希望通過(guò)本文大家能夠掌握這部分內(nèi)容,需要的朋友可以參考下2017-09-09
iOS中TableView如何統(tǒng)一數(shù)據(jù)源代理詳解
這篇文章主要給大家介紹了關(guān)于iOS中TableView如何統(tǒng)一數(shù)據(jù)源代理的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-07-07
iOS實(shí)現(xiàn)圖片壓縮的兩種方法及圖片壓縮上傳功能
ios 圖片壓縮有兩種方法,分別是,壓縮圖片質(zhì)量(Quality),壓縮圖片尺寸(Size),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下2017-01-01
iOS中使用schema協(xié)議調(diào)用APP和使用iframe打開(kāi)APP的例子
這篇文章主要介紹了iOS中使用schema協(xié)議調(diào)用APP和使用iframe打開(kāi)APP的例子,用在瀏覽器中打開(kāi)APP,需要的朋友可以參考下2014-08-08
iOS中wkwebView內(nèi)存泄漏與循環(huán)引用問(wèn)題詳解
這篇文章主要給大家介紹了關(guān)于iOS中wkwebView內(nèi)存泄漏與循環(huán)引用問(wèn)題的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-07-07
iOS11 WKWebView內(nèi)容過(guò)濾規(guī)則詳解
本篇文章主要介紹了iOS11 WKWebView內(nèi)容過(guò)濾規(guī)則詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07
iOS實(shí)現(xiàn)啟動(dòng)引導(dǎo)頁(yè)與指紋解鎖的方法詳解
這篇文章主要給大家介紹了關(guān)于iOS實(shí)現(xiàn)啟動(dòng)引導(dǎo)頁(yè)與指紋解鎖的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-02-02

