版本記錄
版本號 | 時間 |
---|---|
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ù)陕悬,謝謝大家的支持题暖。