详解介绍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强行获取锁。