博客
关于我
互斥锁--NSLock
阅读量:585 次
发布时间:2019-03-11

本文共 1238 字,大约阅读时间需要 4 分钟。

互斥锁在多线程编程中扮演着至关重要的角色,用于保护对临界资源的访问,防止多个线程同时读写同一资源。在iOS开发中,最常用的互斥锁工具包括NSLock、@synchronized、pthread_mutex、NSCondition等。以下我们将重点分析NSLock。

NSLock 简介

NSLock是Objective-C中最基础的锁机制之一,继承自NSObject并遵循NSLocking协议。它的核心功能是阻止多个线程同时访问共享资源。在获取锁时,如果目标锁已被占据,当前线程会被系统挂起,直到占据锁的线程释放资源。

从NSLock的API来看,其实现非常简单:

- (void)lock;- (void)unlock;- (BOOL)tryLock;- (BOOL)lockBeforeDate:(NSDate *)limit;

tryLocklockBeforeDate 方法尤为重要,其中后者通过自旋锁机制,配合时间限制,避免线程等待过久。

NSLock 的注意事项

在使用NSLock时需注意以下几点:

  • 非递归锁特点:NSLock属于非递归锁。多个线程从同一线程获取同一锁时,会导致死锁。本例中的错误代码展示了这种情况:
  • - (void)methodA {    self.lock = [[NSLock alloc] init];    [self.lock lock]; // 1    [self methodB];  // 2    [self.lock unlock]; // 3}- (void)test {    [self.lock lock]; // 3 线程导致死锁    [self.lock unlock]; // 无法执行}
    1. 线程安全:不同线程对同一锁的使用必须严格遵守互斥原则。如果出现违反这种原则的情况,可能导致死锁或数据不一致。
    2. NSLock 的实现细节

      NSLock的底层是基于pthread_mutex实现的,提供了一层封装。具体实现细节包括:

    3. 初始化init方法初始化一个PTHREAD_MUTEX_ERRORCHECK类型的互斥锁。这种类型的锁在加锁失败时会触发错误处理。

    4. 加锁机制lockBeforeDate方法使用pthread_mutex_trylock循环检查是否能在指定时间内获得锁。如果成功,返回YES;如发生死锁(EDEADLK)则触发错误处理,并让出资源。

    5. 错误处理机制

      NSLock内置了错误检测机制。例如,在线程尝试获取已被占据的锁时,会调用用户指定的错误处理函数,提示开发者防止死锁。

      总结

      通过对NSLock的分析可以看出它作为iOS平台的首选互斥锁工具,功能简单而实用。尽管它可能比如>@synchronized或者NSRecursiveLock更基础,但在大多数场景中都是最优解。对于需要更高级互斥控制的场景,可以考虑使用NSConditionLock或NSRecursiveLock。

    转载地址:http://clttz.baihongyu.com/

    你可能感兴趣的文章
    因SGA分配错误无法启动数据库
    查看>>
    Oracle修改字段类型方法总结
    查看>>
    ORA-00020 超过当前最大连接数
    查看>>
    合理控制oracle数据库具有DBA权限的用户
    查看>>
    【Android】源码分析 - Activity启动流程
    查看>>
    喝红茶是否会上火
    查看>>
    Android进阶解密读书笔记2——第2章:Android系统启动——第1、2小节
    查看>>
    Android进阶解密读书笔记3——第2章:Android系统启动——第3、4、5、6小节
    查看>>
    GreenDao之注解
    查看>>
    Android使用Font Awesome
    查看>>
    Execution failed for task ':app:compileDebugKotlin'
    查看>>
    主线程中Looper的轮询死循环为何没有阻塞主线程?
    查看>>
    Gradle实战四:Jenkins持续集成
    查看>>
    使用RestTemplate,显示请求信息,响应信息
    查看>>
    wgcloud运维监控系统错误:防篡改校验错误次数大于10次,不再上报数据
    查看>>
    为什么WGCLOUD安装完后,启动服务端打不开网页
    查看>>
    wgcloud网络监控出现负值
    查看>>
    ios 官方sample
    查看>>
    iOS 开发官方文档链接收集
    查看>>
    网易云面试(Android岗)之旅,差点被这些基础题绊了跟头。
    查看>>