iOS锁-NSConditionLock

作者: 口子窖 | 来源:发表于2018-07-12 11:12 被阅读2次

NSConditionLock

下面是苹果官方文档的说法:

A lock that can be associated with specific, user-defined conditions.

Overview

Using an NSConditionLock object, you can ensure that a thread can acquire a lock only if a certain condition is met. Once it has acquired the lock and executed the critical section of code, the thread can relinquish the lock and set the associated condition to something new. The conditions themselves are arbitrary: you define them as needed for your application.

下面是个人的理解以及一些例子

#import <Foundation/Foundation.h>
@interface NSLockTest : NSObject
- (void)forTest;
@end
#import "NSLockTest.h"
@interface NSLockTest()
@property (nonatomic,strong) NSMutableArray *tickets;
@property (nonatomic,assign) int soldCount;
@property (nonatomic,strong) NSConditionLock *condition;
@end
@implementation NSLockTest
- (void)forTest
{
    self.tickets = [NSMutableArray arrayWithCapacity:1];
    self.condition = [[NSConditionLock alloc]initWithCondition:0];
    NSThread *windowOne = [[NSThread alloc]initWithTarget:self selector:@selector(soldTicketOne) object:nil];
    [windowOne start];
    
    NSThread *windowTwo = [[NSThread alloc]initWithTarget:self selector:@selector(soldTicketTwo) object:nil];
    [windowTwo start];
   
    NSThread *windowTuiPiao = [[NSThread alloc]initWithTarget:self selector:@selector(tuiPiao) object:nil];
    [windowTuiPiao start];

}
//一号窗口
-(void)soldTicketOne
{
    while (YES) {
        NSLog(@"====一号窗口没票了,等别人退票");
        [self.condition lockWhenCondition:1];
        NSLog(@"====在一号窗口买了一张票,%@",[self.tickets objectAtIndex:0]);
        [self.tickets removeObjectAtIndex:0];
        [self.condition unlockWithCondition:0];
    }
}
//二号窗口
-(void)soldTicketTwo
{
    while (YES) {
        NSLog(@"====二号窗口没票了,等别人退票");
        [self.condition lockWhenCondition:2];
        NSLog(@"====在二号窗口买了一张票,%@",[self.tickets objectAtIndex:0]);
        [self.tickets removeObjectAtIndex:0];
        [self.condition unlockWithCondition:0];
    }
}
- (void)tuiPiao
{
    while (YES) {
        sleep(3);
        [self.condition lockWhenCondition:0];
        [self.tickets addObject:@"南京-北京(退票)"];
        int x = arc4random() % 2;
        if (x == 1) {
            NSLog(@"====有人退票了,赶快去一号窗口买");
            [self.condition unlockWithCondition:1];
        }else
        {
            NSLog(@"====有人退票了,赶快去二号窗口买");
            [self.condition unlockWithCondition:2];
        }
    }
    
}
@end

设计了一个例子,有一号售票窗口和二号售票窗口两个窗口可以买票,也会有一个退票窗口,但是退票窗口随机选择退到一号或者二号售票窗口。

NSConditionLock与NSCondition大体相同,但是NSConditionLock可以设置锁条件,而NSCondition确只是无脑的通知信号。

- (void)lockWhenCondition:(NSInteger)condition;

- (void)unlockWithCondition:(NSInteger)condition;

这两个condition一样的时候会相互通知。

过程

1、初始化 self.condition = [[NSConditionLock alloc]initWithCondition:0];

2、获得锁 [self.condition lockWhenCondition:1];

3、解锁 [self.condition unlockWithCondition:1];

相关文章

  • iOS锁系列-目录

    1、 iOS锁系列-NSLock对象锁2、iOS锁系列-NSConditionLock条件锁3、iOS锁系列-NS...

  • iOS锁-NSConditionLock

    NSConditionLock 下面是苹果官方文档的说法: A lock that can be associat...

  • Lock

    iOS中以NS开头常见的锁的有NSCondition、NSConditionLock、NSLock、NSRecur...

  • iOS锁系列-NSConditionLock条件锁

    代码示例: 打印结果: 结果说明: 1 初始化一个条件锁,条件为02 由于线程1 和线程4条件不满足,所以循环一段...

  • iOS中目前最喜欢用的四种锁

    dispatch_semaphore_t(信号锁) NSLock(锁) NSConditionLock(条件锁) ...

  • 条件锁NSConditionLock

    线程锁是什么? 简单来讲,线程锁的存在的就是为了确保数据安全和多线程数据同步。当使用线程A执行一段加锁的代码时,线...

  • 多线程二

    一、死锁 最容易导致死锁的一个情况信号锁 + 互斥锁 ,没处理好,导致死锁,NSConditionLock 解决死...

  • NSConditionLock

    ****NSConditionLock**** 对象所定义的互斥锁可以在使得在某个条件下进行锁定和解锁。它和 **...

  • iOS 底层 day22 多线程 NSConditionLock

    一、 NSConditionLock NSConditionLock 是对 NSCondition 的进一步封装,...

  • iOS多线程安全,引出各种锁(下)

    5、NSConditionLock NSConditionLock其实就是对NSCondition的又一层封装,添...

网友评论

    本文标题:iOS锁-NSConditionLock

    本文链接:https://www.haomeiwen.com/subject/wcafpftx.html