iOS:多線程同步加鎖的簡單介紹
多線程同步加鎖主要方式有3種:NSLock(普通鎖)、NSCondition(狀態鎖)、synchronized同步代碼塊
還有少用的NSRecursiveLock(遞歸鎖)、NSConditionLock(條件鎖)、NSDistributedLock(分布鎖)。
- (void)lock; //加鎖
- (void)unlock; //解鎖
- (void)wait; //睡眠等待解鎖
- (BOOL)waitUntilDate:(NSDate *)limit; //定時等待解鎖
- (void)signal; //加鎖信號
區別:
NSLock和NSCondition都實現<NSLocking>協議;而synchronized(鎖){….}采用同步加鎖的方式實現加鎖,只要鎖是唯一的就可以,一般設置鎖為當前對象或者類名。NSLock和NSCondition是顯式加鎖,synchronized同步代碼塊是隱式加鎖。
協議如下:
@protocol NSLocking- (void)lock; //加鎖
- (void)unlock; //解鎖
@end
詳解介紹NSLock:<NSLocking>-------------普通鎖
<1>屬性:@property (copy) NSString *name //鎖的名字
<2>其他方法:
- (BOOL)tryLock; //嘗試加鎖(有可能已經被其他線程加鎖)
- (BOOL)lockBeforeDate:(NSDate *)limit; //定時加鎖
詳解介紹NSCondition:<NSLocking>---------狀態鎖
<1>屬性:@property (copy) NSString *name //鎖的名字
<2>其他方法:
- (BOOL)waitUntilDate:(NSDate *)limit; //定時等待解鎖
- (void)signal; //加鎖信號
- (void)broadcast; //解鎖通知
詳解介紹NSRecursiveLock:<NSLocking>------ 遞歸鎖
<1>屬性:@property (copy) NSString *name //鎖的名字
<2>其他方法:
- (BOOL)tryLock; //嘗試加鎖(有可能已經被其他線程加鎖,此時無法在加鎖)
- (BOOL)lockBeforeDate:(NSDate *)limit; //定時加鎖
詳解介紹NSConditionLock:<NSLocking>------條件鎖
<1>屬性:@property (copy) NSString *name //鎖的名字
@property (readonly) NSInteger condition; //狀態
<2>其他方法:
- (BOOL)tryLock; //嘗試加鎖(有可能已經被其他線程加鎖)
- (BOOL)lockBeforeDate:(NSDate *)limit; //定時加鎖
- (instancetype)initWithCondition:(NSInteger)condition //初始化
- (void)lockWhenCondition:(NSInteger)condition; //加鎖
- (BOOL)tryLockWhenCondition:(NSInteger)condition; //嘗試解鎖
- (void)unlockWithCondition:(NSInteger)condition; //解鎖
- (BOOL)lockWhenCondition:(NSInteger)condition beforeDate:(NSDate *)limit; //定時加鎖
具體使用簡單演示:
1、NSLock的使用:
第一步:創建鎖對象
NSLock *mylock = [[NSLock alloc]init];
while(true)
{
第二步:將共享搶占資源加鎖
[mylock lock];
{..........對共享搶占資源進行操作的代碼..........}
第三步:操作完數據,馬上釋放鎖,給其他的線程調用操作
[mylock unlock];
....................
}
2、NSCondition和NSRecursiveLock的使用與NSLock基本一樣,只不過NSRecursiveLock會反復調用罷了,這里介紹NSCondition即可。
第一步:創建鎖對象
NSCondition *mylock = [[NSCondition alloc]init];
while(true)
{
第二步:將共享搶占資源加鎖
[mylock lock];
{..........對共享搶占資源進行操作的代碼..........}
第三步:操作完數據,馬上釋放鎖,給其他的線程調用操作
[mylock unlock];
....................
}
3、synchronized同步代碼塊的使用:
將共享搶占資源和執行代碼放入其中即可
while(true)
{
@synchronized(self)
{..........對共享搶占資源進行操作的代碼..........}
....................
}
說明:
4、條件鎖NSConditionLock的使用:
第一步:設置條件(初始化)
NSConditionLock *conLock = [[NSConditionLock alloc] initWithCondition:No_Data];
第二步:對線程一加鎖解鎖(生產者)
while(true)
{
[conLock lockWhenCondition:No_Data]; //加鎖
{..........對共享搶占資源進行操作的代碼..........}
[conLock unlockWhenCondition:Has_Data]; //解鎖,此時的條件Condition設為了內部的某一個數據,可以自定義設定
}
第三步:對線程二加鎖解鎖(消費者)
while(true)
{
[conLock lockWhenCondition:Has_Data]; //加鎖
{..........對共享搶占資源進行操作的代碼..........}
[conLock unlockWhenCondition:No_Data]; //解鎖
}
5、分布鎖NSDistributedLock的使用
NSDistributedLock,分布鎖,文件方式實現,可以跨進程
用tryLock方法獲取鎖。
用unlock方法釋放鎖。
如果一個獲取鎖的進程在釋放鎖之前掛了,那么鎖就一直得不到釋放了,此時可以通過breakLock強行獲取鎖。
用tryLock方法獲取鎖。
用unlock方法釋放鎖。
如果一個獲取鎖的進程在釋放鎖之前掛了,那么鎖就一直得不到釋放了,此時可以通過breakLock強行獲取鎖。
程序猿神奇的手,每時每刻,這雙手都在改變著世界的交互方式!
浙公網安備 33010602011771號