详解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


相关推荐: html5audio标签播放结束怎么触发事件_onended回调方法【教程】  如何将凡科建站内容保存为本地文件?  JavaScript模板引擎Template.js使用详解  html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】  Laravel如何实现用户注册和登录?(Auth脚手架指南)  Laravel如何与Inertia.js和Vue/React构建现代单页应用  google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤  如何在Windows虚拟主机上快速搭建网站?  如何快速生成凡客建站的专业级图册?  Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  javascript中对象的定义、使用以及对象和原型链操作小结  Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程  JS经典正则表达式笔试题汇总  如何快速建站并高效导出源代码?  如何快速打造个性化非模板自助建站?  Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  php在windows下怎么调试_phpwindows环境调试操作说明【操作】  如何用花生壳三步快速搭建专属网站?  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧  Laravel如何创建自定义Facades?(详细步骤)  Laravel怎么在Controller之外的地方验证数据  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  公司网站制作价格怎么算,公司办个官网需要多少钱?  Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】  1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤  如何在IIS中新建站点并配置端口与物理路径?  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  Python正则表达式进阶教程_复杂匹配与分组替换解析  如何在Tomcat中配置并部署网站项目?  javascript中闭包概念与用法深入理解  绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信  大连 网站制作,大连天途有线官网?  Midjourney怎么调整光影效果_Midjourney光影调整方法【指南】  Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程  EditPlus中的正则表达式实战(5)  教你用AI将一段旋律扩展成一首完整的曲子  Laravel如何创建自定义Artisan命令?(代码示例)  Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】  UC浏览器如何设置启动页 UC浏览器启动页设置方法  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  网站制作企业,网站的banner和导航栏是指什么?  Laravel Seeder填充数据教程_Laravel模型工厂Factory使用  黑客入侵网站服务器的常见手法有哪些?  JavaScript常见的五种数组去重的方式  JavaScript实现Fly Bird小游戏  Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面  如何在自有机房高效搭建专业网站?