iOS開發(fā)中的幾種鎖(四)

版本記錄

版本號 時間
V1.0 2017.05.21

前言

ios中有好幾種鎖罗晕,比如自旋鎖,互斥鎖脆贵,信號量等等,鎖其實是多線程數(shù)據(jù)安全的一種解決方案起暮,作用就是保證同一時間只有一個線程訪問和改變某些敏感數(shù)據(jù)卖氨,這些鎖的性能也是差別很大,最近看了幾個技術(shù)大牛的技術(shù)博客负懦,我才發(fā)現(xiàn)我以前對鎖的理解太膚淺了筒捺,心虛的趕緊找資料又開始了深入學(xué)習(xí),然后整理出來纸厉。前面介紹了幾種鎖:
1. ios開發(fā)中的幾種鎖(一)
2. ios開發(fā)中的幾種鎖(二)
3. ios開發(fā)中的幾種鎖(三)

這篇接著講其他的幾種鎖系吭。

詳情

一、synchronized 條件鎖

@synchronized 相信大家應(yīng)該都熟悉残腌,它的用法應(yīng)該算這些鎖中最簡單的村斟。

看代碼


1. JJSynchronizedVC.h
#import <UIKit/UIKit.h>

@interface JJSynchronizedVC : UIViewController

@end

2. JJSynchronizedVC.m

#import "JJSynchronizedVC.h"

@interface JJSynchronizedVC ()

@end

@implementation JJSynchronizedVC

#pragma mark - Override Base Function

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    [self aboutSynchronized];
}

#pragma mark - Object Private Function

- (void)aboutSynchronized
{
    int __block num = 5;
    
    //線程1
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        @synchronized (self)
        {
            num = num + 1;
            NSLog(@"num1=%d",num);
            NSLog(@"線程1");
        }
    });
    
    //線程2
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        @synchronized (self)
        {
            
            num = num + 1;
            NSLog(@"num2=%d",num);
            NSLog(@"線程2");
        }
    });
}

@end

更多關(guān)于synchronized鎖的可以參考《 關(guān)于 @synchronized贫导,這兒比你想知道的還要多》


二、NSConditionLock 條件鎖

我們還是先看一下API

@interface NSConditionLock : NSObject <NSLocking> {
@private
    void *_priv;
}

- (instancetype)initWithCondition:(NSInteger)condition NS_DESIGNATED_INITIALIZER;

@property (readonly) NSInteger condition;
- (void)lockWhenCondition:(NSInteger)condition;
- (BOOL)tryLock;
- (BOOL)tryLockWhenCondition:(NSInteger)condition;
- (void)unlockWithCondition:(NSInteger)condition;
- (BOOL)lockBeforeDate:(NSDate *)limit;
- (BOOL)lockWhenCondition:(NSInteger)condition beforeDate:(NSDate *)limit;

@property (nullable, copy) NSString *name NS_AVAILABLE(10_5, 2_0);

@end

相比于 NSLock 多了個 condition 參數(shù)蟆盹,我們可以理解為一個條件標(biāo)示孩灯。

下面我們就看代碼

1. JJNSCondationLockVC.h

#import <UIKit/UIKit.h>

@interface JJNSCondationLockVC : UIViewController

@end
2. JJNSCondationLockVC.m

#import "JJNSCondationLockVC.h"

@interface JJNSCondationLockVC ()

@end

@implementation JJNSCondationLockVC

#pragma mark - Override Base Function

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    [self aboutNSCondationLock];
    
}

#pragma mark - Object Private Function

- (void)aboutNSCondationLock
{
    NSConditionLock *condationLock = [[NSConditionLock alloc] init];

    //線程1
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        if([condationLock tryLockWhenCondition:0]){
            NSLog(@"線程1");
            [condationLock unlockWithCondition:1];
        }else{
            NSLog(@"失敗");
        }
    });
    
    
    //線程2
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        [condationLock lockWhenCondition:3];
        NSLog(@"線程2");
        [condationLock unlockWithCondition:2];
    });
    
    
    //線程3
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        [condationLock lockWhenCondition:1];
        NSLog(@"線程3");
        [condationLock unlockWithCondition:3];
    });
}

@end

下面看輸出結(jié)果

2017-05-21 23:42:52.873 lock[4843:255681] 線程1
2017-05-21 23:42:52.874 lock[4843:255670] 線程3
2017-05-21 23:42:52.875 lock[4843:255671] 線程2

由上可知,我們在初始化 NSConditionLock 對象時逾滥,給了他的標(biāo)示為 0峰档;執(zhí)行 tryLockWhenCondition:時,我們傳入的條件標(biāo)示也是 0寨昙,所 以線程1 加鎖成功讥巡;執(zhí)行 unlockWithCondition:時,這時候會把condition由 0 修改為 1舔哪;因為condition 修改為了 1欢顷, 會先走到 線程3,然后 線程3 又將 condition 修改為 3捉蚤,最后走了線程2 的流程抬驴。

從上面的結(jié)果我們可以發(fā)現(xiàn),NSConditionLock 還可以實現(xiàn)任務(wù)之間的依賴缆巧。

相關(guān)參考技術(shù)博客

1.iOS 開發(fā)中的八種鎖(Lock)
2.不再安全的 OSSpinLock
3. NSRecursiveLock遞歸鎖的使用
4.關(guān)于dispatch_semaphore的使用
5.實現(xiàn)鎖的多種方式和鎖的高級用法

后記

??這回八種鎖的簡單介紹以及使用方法就都結(jié)束了布持,以后會添加對這八種方法的深入理解。待續(xù)陕悬,謝謝大家的支持题暖。

08北京奧運,那一年我剛好大一
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末捉超,一起剝皮案震驚了整個濱河市胧卤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌狂秦,老刑警劉巖灌侣,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件推捐,死亡現(xiàn)場離奇詭異裂问,居然都是意外死亡,警方通過查閱死者的電腦和手機牛柒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進(jìn)店門堪簿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人皮壁,你說我怎么就攤上這事椭更。” “怎么了蛾魄?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵虑瀑,是天一觀的道長湿滓。 經(jīng)常有香客問我,道長舌狗,這世上最難降的妖魔是什么叽奥? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮痛侍,結(jié)果婚禮上朝氓,老公的妹妹穿的比我還像新娘。我一直安慰自己主届,他們只是感情好赵哲,可當(dāng)我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著君丁,像睡著了一般枫夺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上绘闷,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天筷屡,我揣著相機與錄音,去河邊找鬼簸喂。 笑死毙死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的喻鳄。 我是一名探鬼主播扼倘,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼除呵!你這毒婦竟也來了再菊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤颜曾,失蹤者是張志新(化名)和其女友劉穎纠拔,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體泛豪,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡稠诲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了诡曙。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片臀叙。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖价卤,靈堂內(nèi)的尸體忽然破棺而出劝萤,到底是詐尸還是另有隱情,我是刑警寧澤慎璧,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布床嫌,位于F島的核電站跨释,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏厌处。R本人自食惡果不足惜煤傍,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嘱蛋。 院中可真熱鬧蚯姆,春花似錦、人聲如沸洒敏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽凶伙。三九已至郭毕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間函荣,已是汗流浹背显押。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留傻挂,地道東北人乘碑。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像金拒,于是被迫代替她去往敵國和親兽肤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 為什么要有鎖绪抛? 在使用多線程的時候多個線程可能會訪問同一塊資源资铡,這樣就很容易引發(fā)數(shù)據(jù)錯亂和數(shù)據(jù)安全等問題,這時候就...
    153037c65b0c閱讀 563評論 0 1
  • iOS開發(fā)中常用的幾種鎖 簡介: 操作系統(tǒng)在進(jìn)行多線程調(diào)度的時候幢码,為了保證多線程安全引入了鎖的機制笤休,以實現(xiàn)指定代碼...
    sunnyxg0812閱讀 1,281評論 0 2
  • 線程安全是什么? 當(dāng)一個線程訪問數(shù)據(jù)的時候症副,其他的線程不能對其進(jìn)行訪問店雅,直到該線程訪問完畢。簡單來講就是在同一時刻...
    6ffd6634d577閱讀 2,202評論 1 7
  • 前言 在多線程開發(fā)中瓦糕,常會遇到多個線程訪問修改數(shù)據(jù)底洗。為了防止數(shù)據(jù)不一致或數(shù)據(jù)污染腋么,通常采用加鎖機制來保證線程安全咕娄。...
    趙夢楠閱讀 954評論 0 5
  • 轉(zhuǎn)自(https://bestswifter.com/ios-lock/#) 深入理解 iOS 開發(fā)中的鎖 摘要 ...
    犯色戒的和尚閱讀 321評論 0 1