线程锁

作者: rapunzelyeah | 来源:发表于2017-06-15 13:27 被阅读0次

    iOS中有几种线程锁:@synchronized、NSLock以及NSRecursiveLock(递归锁)。本文用于记录这几种线程锁的区别以及使用方式。

    synchronized关键字

    @synchronized,代表这个方法加锁, 相当于不管哪一个线程(例如线程A),运行到这个方法时,都要检查有没有其它线程例如B正在用这个方法,有的话要等正在使用synchronized方法的线程B运行完这个方法后再运行此线程A,没有的话,直接运行。它包括两种用法:synchronized 方法和 synchronized 块。

    @synchronized 方法控制对类(一般在IOS中用在单例中)的访问:每个类实例对应一把锁,每个 synchronized 方法都必须获得调用该方法锁方能执行,否则所属就会发生线程阻塞,方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。这种机制确保了同一时刻对于每一个类,至多只有一个处于可执行状态,从而有效避免了类成员变量的访问冲突(只要所有可能访问类的方法均被声明为 synchronized)

    synchronized块

    @通过 synchronized关键字来声明synchronized 块。语法如下:
      @synchronized(syncObject) { }
      synchronized 块是这样一个代码块,其中的代码必须获得对象 syncObject (如前所述,可以是类实例或类)的锁方能执行,具体机制同前所述。由于可以针对任意代码块,且可任意指定上锁的对象,故灵活性较高。

    NSLock

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

    NSRecursiveLock,递归锁

    NSRecursiveLock,多次调用不会阻塞已获取该锁的线程。

    NSConditionLock,条件锁

    NSConditionLock,条件锁,可以设置条件

    NSDistributedLock,分布锁

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

    相关文章

      网友评论

          本文标题:线程锁

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