ios中的几大锁

·  阅读 107

ios中的锁.png

使用方法:对于锁的使用大致分为以下几步:
  1. 创建锁
  2. 可选(对于pthread_mutex):设置锁的一些属性
  3. 加锁、解锁
  4. 可选:对于提供了释放锁的API,我们都应该释放资源

下面以几种锁为例子,主要掌握了加锁、解锁的思想,其他锁的使用都差不多。

  1. os_unfair_lock(不安全的锁)

      #import <os/lock.h>
      - (instancetype)init
      {
          self = [super init];
          if (self) {
              self.lock = OS_UNFAIR_LOCK_INIT;
          }
          return self;
      }
      -(void)saleTicket {
          os_unfair_lock_lock(&_lock);
          [super saleTicket];
          os_unfair_lock_unlock(&_lock);
      }
    复制代码
  2. OSSpinLock(自旋锁)

      #import <libkern/OSAtomic.h>
      - (instancetype)init
      {
          self = [super init];
          if (self) {
              self.lock = OS_SPINLOCK_INIT;
          }
          return self;
      }
      ​
      - (void)saleTicket {
          OSSpinLockLock(&_lock);
          [super saleTicket];
          OSSpinLockUnlock(&_lock);
      }
    复制代码
  3. NSLock(其实是对pthread_mutex普通锁(PTHREAD_MUTEX_NORMAL等价于PTHREAD_MUTEX_DEFAULT)的封装)

      
      - (instancetype)init
      {
          self = [super init];
          if (self) {
              self.lock = [[NSLock alloc] init];
          }
          return self;
      }
      ​
      -(void)saleTicket {
          [self.lock lock];
          [super saleTicket];
          [self.lock unlock];
      }
    复制代码
  4. NSCondition(条件)

      
      @interface NSConditionDemo ()
      ​
      /**
       NSCondition:本质上是对pthread_mutext和pthread_cond_t的封装
       */
      @property(nonatomic, strong)NSCondition *condition;
      @property(nonatomic, strong)NSMutableArray *itemsArray;
      ​
      @end@implementation NSConditionDemo
      - (instancetype)init
      { 
          self = [super init];
          if (self) {
              self.condition = [[NSCondition alloc] init];
              self.itemsArray = @[].mutableCopy;
          }
          return self;
      }
      -(void)saleTicketTest {
          dispatch_async(dispatch_get_global_queue(0, 0), ^{
              for (int i = 0; i < 15; i++) {
                  [[[NSThread alloc] initWithTarget:self selector:@selector(__addItem) object:nil] start];
                  [[[NSThread alloc] initWithTarget:self selector:@selector(__removeItem) object:nil] start];
              }
          });
      }
      ​
      - (void)__addItem {
          [self.condition lock];
          
          [self.itemsArray addObject:@123];
          NSLog(@"添加元素");
          sleep(1);
          
          //添加元素后,会signal该条件
          [self.condition unlock];
          
          [self.condition signal];
          
      }
      ​
      - (void)__removeItem {
          [self.condition lock];
          
          if(self.itemsArray == 0) {
              ///如果条件被signal,那么就会加锁,继续执行代码。
              ///如果条件没被signal,那么就会释放刚才已经获得的锁,然后休眠,等待条件被signal
              [self.condition wait];
          }
          [self.itemsArray removeObject:@12];
          
          NSLog(@"删除元素");
          [self.condition unlock];
      }
      @end复制代码
  5. pthread_mutex(recursive)(递归锁)

  6. NSRecursiveLock(递归锁):其实是对pthread_mutex(PTHREAD_MUTEX_RECURSIVE)的封装

  7. NSConditionLock(条件锁)

  8. @synchoronized(递归锁)

分类:
iOS
标签:
分类:
iOS
标签:
收藏成功!
已添加到「」, 点击更改