详解iOS 多线程 锁 互斥 同步

发布时间 - 2026-01-10 21:52:29    点击率:

在iOS中有几种方法来解决多线程访问同一个内存地址的互斥同步问题:

方法一,@synchronized(id anObject),(最简单的方法)

会自动对参数对象加锁,保证临界区内的代码线程安全

@synchronized(self) 
 
{ 
 
    // 这段代码对其他 @synchronized(self) 都是互斥的     
 
    // self 指向同一个对象 
 
}  

方法二,NSLock
NSLock对象实现了NSLocking protocol,包含几个方法:

  • lock,加锁
  • unlock,解锁
  • tryLock,尝试加锁,如果失败了,并不会阻塞线程,只是立即返回NO
  • lockBeforeDate:,在指定的date之前暂时阻塞线程(如果没有获取锁的话),如果到期还没有获取锁,则线程被唤醒,函数立即返回NO

比如:

NSLock *theLock = [[NSLock alloc] init];  
if ([theLock lock])  
{ 
  //do something here 
  [theLock unlock];  
}  

方法三,NSRecursiveLock,递归锁

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

 NSRecursiveLock *theLock = [[NSRecursiveLock alloc] init];  
 void MyRecursiveFunction(int value)  
{  
 [theLock lock];  
 if (value != 0)  
<span style="font-size:14px;"> </span>{  
  –value;  
  MyRecursiveFunction(value);  
 } 
 [theLock unlock];  
}  
 
 MyRecursiveFunction(5); 

方法四,NSConditionLock,条件锁

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

//公共部分 
id condLock = [[NSConditionLock alloc] initWithCondition:NO_DATA];  
    
 //线程一,生产者 
 while(true) {  
    [condLock lockWhenCondition:NO_DATA];  
    //生产数据 
    [condLock unlockWithCondition:HAS_DATA];  
} 
    
 //线程二,消费者 
 while (true) {  
    [condLock lockWhenCondition:HAS_DATA];  
    //消费 
    [condLock unlockWithCondition:NO_DATA];  
} 

方法五,NSDistributedLock,分布锁

NSDistributedLock,分布锁,文件方式实现,可以跨进程

  • 用tryLock方法获取锁。
  • 用unlock方法释放锁。

如果一个获取锁的进程在释放锁之前挂了,那么锁就一直得不到释放了,此时可以通过breakLock强行获取锁。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# ios  # 多线程数据同步  # 多线程同步  # ios多线程同步问题  # iOS中的线程死锁实例详解  # IOS 线程死锁详细介绍  # 详解iOS多线程之2.NSThread的加锁@synchronized  # iOS中多网络请求的线程安全详解  # 浅析iOS应用开发中线程间的通信与线程安全问题  # iOS开发常用线程安全锁  # 加锁  # 递归  # 都是  # 几个  # 还没有  # 互斥  # 中有  # 这段  # 可以通过  # 如果没有  # 几种  # 区内  # 挂了  # 最简单  # 方法来  # 多线程  # 大家多多  # 解锁  # 实现了  # 失败了 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何在云服务器上快速搭建个人网站?  Laravel观察者模式如何使用_Laravel Model Observer配置  深入理解Android中的xmlns:tools属性  bootstrap日历插件datetimepicker使用方法  Bootstrap整体框架之JavaScript插件架构  想要更高端的建设网站,这些原则一定要坚持!  BootStrap整体框架之基础布局组件  Python结构化数据采集_字段抽取解析【教程】  使用spring连接及操作mongodb3.0实例  Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层  如何在云指建站中生成FTP站点?  如何用AWS免费套餐快速搭建高效网站?  高端云建站费用究竟需要多少预算?  如何用花生壳三步快速搭建专属网站?  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  Laravel如何创建自定义中间件?(Middleware代码示例)  UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】  如何快速辨别茅台真假?关键步骤解析  浅析上传头像示例及其注意事项  Firefox Developer Edition开发者版本入口  Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  手机网站制作与建设方案,手机网站如何建设?  Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件  Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID  详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点  网站图片在线制作软件,怎么在图片上做链接?  三星、SK海力士获美批准:可向中国出口芯片制造设备  香港服务器租用每月最低只需15元?  Laravel如何发送系统通知?(Notification渠道示例)  谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  node.js报错:Cannot find module &#39;ejs&#39;的解决办法  Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制  如何用搬瓦工VPS快速搭建个人网站?  在线制作视频的网站有哪些,电脑如何制作视频短片?  Laravel如何使用查询构建器?(Query Builder高级用法)  5种Android数据存储方式汇总  如何在阿里云服务器自主搭建网站?  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  Laravel如何升级到最新版本?(升级指南和步骤)  Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程  如何制作一个表白网站视频,关于勇敢表白的小标题?  浅谈Javascript中的Label语句  在centOS 7安装mysql 5.7的详细教程  Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】  Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】  如何挑选优质建站一级代理提升网站排名?  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?