iOS 多线程中的锁

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014799068/article/details/81323968

锁的分类以及简单介绍

一. 锁的分类

  • 互斥锁
    互斥锁是一种信号量,一次只允许访问一个线程。如果正在使用互斥锁并且另一个线程试图获取它,则该线程将阻塞,直到互斥锁被其原始持有者释放。如果多个线程竞争相同的互斥锁,则一次只允许一个互斥锁访问它。
  • 递归锁定(也是互斥锁)
    递归锁是互斥锁的变体。递归锁允许单个线程在释放之前多次获取锁。其他线程保持阻塞状态,直到锁的所有者释放锁的次数与获取锁的次数相同。在递归迭代期间主要使用递归锁,但也可以在多个方法分别需要获取锁的情况下使用递归锁。
  • 读写锁定(共享独占锁)
    读写锁也称为共享独占锁。这种类型的锁通常用于大规模操作,并且如果经常读取受保护的数据结构并且仅偶尔修改,则可以显着提高性能。在正常操作期间,多个读取器可以同时访问数据结构。但是,当线程想要写入结构时,它会阻塞,直到所有读取器释放锁定,此时它获取锁定并可以更新结构。当写入线程正在等待锁定时,新的读取器线程会阻塞,直到写入线程完成。系统仅支持使用POSIX线程的读写锁。(pthread)
  • 分布式锁
    分布式锁提供进程级别的互斥访问。与真正的互斥锁不同,分布式锁定不会阻止进程或阻止进程运行。它只是报告锁何时繁忙,并让流程决定如何继续。
  • 自旋锁
    自旋锁重复轮询其锁定条件,直到该条件成立为止。自旋锁最常用于多处理器系统,其中锁的预期等待时间很短。在这些情况下,轮询通常比阻塞线程更有效,这涉及上下文切换和线程数据结构的更新。由于其轮询性质,系统不提供任何旋转锁的实现,但您=可以在特定情况下实现。
  • 双重锁定
    双重检查锁是尝试通过在锁定之前测试锁定标准来减少锁定的开销。由于双重检查的锁可能不安全,因此系统不会为它们提供明确的支持,因此不鼓励使用它们。
    二. 使用锁
    1.使用@synchronized指令
    该@synchronized指令是在Objective-C代码中动态创建互斥锁的便捷方式。该@synchronized指令执行任何其他互斥锁将执行的操作 - 它可以防止不同的线程同时获取相同的锁,在这种情况下,您不必直接创建互斥锁或锁定对象。相反,您只需使用任何Objective-C对象作为锁定标记.
@synchronized(anObj)
    {
        //大括号之间的所有内容都受@synchronized指令保护。
    }

传递给@synchronized指令的对象是用于区分受保护块的唯一标识符。如果在两个不同的线程中执行上述方法,则anObj在每个线程上为参数传递一个不同的对象,每个线程都会锁定并继续处理,而不会被另一个阻塞。但是,如果在两种情况下都传递相同的对象,则其中一个线程将首先获取锁定,另一个线程将阻塞,直到第一个线程完成关键部分。
作为预防措施,该@synchronized块隐式地向受保护代码添加异常处理程序。如果抛出异常,此处理程序会自动释放互斥锁。这意味着为了使用该@synchronized指令,还必须在代码中启用Objective-C异常处理。

猜你喜欢

转载自blog.csdn.net/u014799068/article/details/81323968
今日推荐