多线程下载图片,滑动tableView崩溃--资源抢夺问题
最近练习使用NSoperation模拟SDWebImage下载图片,发生了崩溃的问题,还专门写博客记录这件事情: http://www.cnblogs.com/tufei7/p/7074030.html, 当时以为是因为weakSelf和StrongSelf造成的崩溃, 然而我尽管用了StrongSelf和WeakSelf仍然崩溃,当时我也很崩溃.
思前想后还是跟demo源码对比下吧,对比发现:
demo代码 红框里面的代码是写在 mainQueue的block里面的, 我的是写在mainQueue上面也就是子线程中的.
我蒙圈了,为啥呢? 我去请教大神,大神说:"因为你对字典进行插入(也叫写)操作,如果是多线程并发执行,可能会发生资源抢夺,资源抢夺会造成崩溃.对字典进行读操作不会造成资源抢夺"
名词解释:资源抢夺 , 我的理解是多条线程操作同一个可变对象(这里是字典),
名词解释:死锁 资源抢夺貌似跟死锁没关系
问: 解决资源抢夺有哪些方式?
答: a): 推荐的写法 @synchronized代码块
- @synchronized(self)
- {
- //关键代码;
- }
b): NSLock同步锁. lock unLock
c): 使用dispatch信号量
最简单的写法是 @synchronized, 我这样写也是可以的: 在子线程对字典进行写操作,但是加锁
下面的博客写的特别仔细
iOS多线程开发资源抢夺和线程间的通讯问题
http://www.cnblogs.com/huanying2000/p/6138573.html
死锁:
http://www.cnblogs.com/tufei7/p/6044384.html
dispatch_sync(dispatch_get_main_queue(), ^{
});
在sync同步,阻塞主线程,会等待block执行完毕才返回, 当queue是串行队列,会造成死锁, 因为block要放在队列的队尾执行, block要最后执行, sync
GCD中死锁的三种方式
http://www.jianshu.com/p/f1c6e1eba5bd
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?