• IOS 多线程 锁 互斥 同步


    方法一,@synchronized(id anObject),(最简单的方法)
    会自动对参数对象加锁,保证临界区内的代码线程安全

    1 @synthesize(self)
    2     {
    3         //这段代码对其它 @synthesize(self) 都是互斥的
    4         
    5         //self 指向同一个对象
    6     }

    方法二,NSLock
    NSLock对象实现了NSLocking protocol,包含几个方法:
    lock,加锁
    unlock,解锁
    tryLock,尝试加锁,如果失败了,并不会阻塞线程,会立即返回NO
    lockBeforeDate:,在指定的date之前暂时阻塞线程(如果没有获取锁的话),如果到期还没有获取锁,则线程被唤醒,函数立即返回NO

    1     NSLock *thisLock = [[NSLock alloc] init];
    2     if ([thisLock lock]) {
    3         
    4         //这里添加你所需要的代码即可
    5         
    6         [thisLock unlock];
    7         
    8     }

    方法三,NSRecursiveLock,递归锁
    NSRecursiveLock,多次调用不会阻塞已获取该锁的线程。

     1     NSRecursiveLock *theLock = [[NSRecursiveLock alloc] init];
     2     void myFunction(int value)
     3     {
     4         [theLock lock];
     5         if (value != 0)
     6         <span style=@"font-size:14px"></span>{
     7             -value ;
     8             myFunction(value) ;
     9         }
    10         
    11         [theLock unlock];
    12     }
    13    
    14     myFunction(5) ;

    方法四,NSDistributedLock,分布锁
    NSDistributedLock,分布锁,文件方式实现,可以跨进程
    用tryLock方法获取锁。
    用unlock方法释放锁。
    如果一个获取锁的进程在释放锁之前挂了,那么锁就一直得不到释放了,此时可以通过breakLock强行获取锁。

    方法五,NSConditionLock,条件锁
    NSConditionLock,条件锁,可以设置条件

     1 //公共部分
     2     id conditionLock = [[NSConditionLock alloc] initWithCondition:NO_DATA];
     3     //线程一,生产者
     4     while (true) {
     5         [conditionLock lockWhenCondition:NO_DATA];
     6         //生产数据
     7         [conditionLock unlockWithCondition:PRO_DATA];
     8     }
     9     
    10     //线程二,消费者
    11     while (true) {
    12         
    13         [conditionLock lockWhenCondition:PRO_DATA];
    14         //消费
    15         [conditionLock unlockWithCondition:NO_DATA];
    16     }
  • 相关阅读:
    vue初级 总结
    defineProperty和defineProperties介绍
    vue的生命周期
    将组件拼装使用
    Android和Html的简单交互
    Android接口回调的理解
    Android设计模式—— 观察者模式(以及EventBus的简单使用)
    Android Span的简单使用
    Android7.0打开sdacrd图片问题
    打开图片无缩略图错误
  • 原文地址:https://www.cnblogs.com/yyxblogs/p/4820371.html
Copyright © 2020-2023  润新知