iOS 多線程加鎖有很多方式:@synchronized
贞言、 NSLock
、NSRecursiveLock
阀蒂、NSCondition
该窗、NSConditionLock
、pthread_mutex
蚤霞、dispatch_semaphore
酗失、OSSpinLock
、atomic(property) set/get
等等争便。
NSLock 類為并發(fā)編程實(shí)現(xiàn)了一種基本的互斥鎖级零。
相對(duì)于 @synchronized 的隱式創(chuàng)建鎖断医,NSLock是直接創(chuàng)建鎖滞乙。
NSLocking 協(xié)議
@protocol NSLocking
- (void)lock;
- (void)unlock;
@end
NSLock
NSLock 遵循的NSLocking 協(xié)議
@property (nullable, copy) NSString *name API_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0));
- (BOOL)tryLock;
- (BOOL)lockBeforeDate:(NSDate *)limit;
NSConditionLock 條件鎖
NSConditionLock類定義了一種只在特定條件(這條件是由開發(fā)者自己定義的整數(shù)值)下才能被獲取和釋放的鎖。用于確保任務(wù)在以指定的順序執(zhí)行鉴嗤。NSConditionLock類遵循的NSLocking 協(xié)議斩启。
條件鎖有些相似于GCD的信號(hào)量dispatch_semaphore
。
- 初始化
- (instancetype)initWithCondition:(NSInteger)condition NS_DESIGNATED_INITIALIZER;
@property (readonly) NSInteger condition;
- condition = YES醉锅,
-(void)basicCondition{
NSConditionLock *lock = [[NSConditionLock alloc]initWithCondition:NO];
[lock lock];
[lock unlockWithCondition:YES];
}
NSRecursiveLock
NSRecursiveLock類定義了一個(gè)在不引起死鎖的情況下兔簇,可以被同一個(gè)線程多次獲取的鎖。NSConditionLock類遵循的NSLocking 協(xié)議硬耍。
NSCondition
- 讓當(dāng)前線程處于等待的狀態(tài)
- (void)wait;
- 增加信號(hào)量量垄琐,讓程序可以運(yùn)行
- (void)signal;