美文网首页
多线程异步安全,安全锁的问题

多线程异步安全,安全锁的问题

作者: 上帝是个女孩丶 | 来源:发表于2017-06-29 12:05 被阅读18次

    本篇文章主要介绍多线程在异步时候的内部代码调用。以及加锁时候代码的调用。比较明显的使用地点是数据库操作。资源竞争。

    首先我们常用到的锁有以下几种:

    @synchronizad、atomic、NSLook、NSRecursiveLock(递归锁)


    接下来先逐一简单介绍一下这些个线程锁:

    1. @synchronizad

    这个是常规的局部代码锁。使用方式:

    ```@synchronized(lock){

         A代码

    }```

    ```@synchronized(lock){

         B代码

    }```

    lock 是id类型,只要求唯一性就可以。

    加密后相当于队列效果,执行完A之后才会执行B。即便是两个异步线程。

    2.aotomic

    这个属于属性锁,也就是原子操作。一个@property使用了这个关键字之后,他的setter方法会自动枷锁。加锁方式用的就是@synchronizad。  但是这个属性不要随便乱用,第一他的性能消耗太高,是noaotomic的20倍差不多。而且,仅仅对setter方法加锁是有漏洞的,具体例子就是读取和set的顺序问题。

    3.NSLook

    有点类似于@synchronized  保证多线程代码安全

    lock = [[NSLock alloc] init];

    [lock lock];

    //代码块

    [lock unlock];

    4.NSCondition

    条件锁,只有达到条件之后,才会执行锁操作

    BOOL canLock = [conditionLock tryLockWhenCondition:condition];

    5.NSRecursiveLock  

    递归锁主要防止崩溃,一个代码块里多次加锁

    比如:自身调用自身加锁。

    下面介绍一下多线程中加锁:先贴几行代码:

    待更新。。。

    相关文章

      网友评论

          本文标题:多线程异步安全,安全锁的问题

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