Swift3.0 gcd学习(3)
来源:互联网 发布:淘宝优惠卷名称 编辑:程序博客网 时间:2024/05/20 16:39
Swift3.0 gcd学习(3)
demo git地址
Deadlock 死锁
之前提到过gcd死锁:两个线程因为互相等待对方完成而都被卡住。第一个不能完成是因为它在等待第二个的完成。但第二个也不能完成,因为它在等待第一个的完成。怎么理解呢?先看个例子,一言不合上代码:
//block1{ print("1"); let m = DispatchQueue.main; //block2 m.sync { print("2"); } print("3"); }
猜猜最后输出结果是怎么样的?只有print("1");
输出了,后面的2和3并没有,卡死在了现场。
分析下原理:
首先,主队列是一个串行队列,遵行的是FIFO的原则,先入队的先执行,所以block2必须要等到block1执行完才能开始执行。但是因为block2是同步执行,也就是block1要等到block2执行完才能继续下去!于是就出现了一个互相等待对方完成,最后卡死的结局。
再来猜猜这段代码的输出结果:
//block1print("1"); let m = DispatchQueue.main; //block2 m.async { print("2"); //block3 m.sync { print("3"); } } print("4");//输出结果142(然后卡死)
如果没想明白为什么异步调用依然会卡死,来分析下原理:
首先block先输出了1,然后异步调用了block2,因为是异步调用,所以block2并不会阻塞block1的执行,于是block1继续执行,输出了4。block2开始执行后,输出了3,精彩的部分来了:由于主队列是串行队列block3必须等到block2执行完才能开始,但是因为block3是同步调用,阻塞了block2的完成,于是一个互相等待对方完成的局面又出现了。
看完了上面两个例子,我个人得出这样的一点经验:
如果不想程序莫名卡死,绝对不要在一个串行队列里执行同步调用的代码!
0 0
- Swift3.0 gcd学习(3)
- Swift3.0 gcd学习(1)
- Swift3.0 gcd学习(2)
- Swift3.0学习之GCD
- swift3.0 GCD
- swift3.0 gcd 变化
- swift3.0 GCD
- swift3.0 gcd 变化
- IOS GCD Swift3.0
- swift学习笔记 - swift3.0用GCD实现计时器
- Swift3.0--GCD
- swift3.0 GCD DispatchSourceTimer注意事项
- Swift3.0 GCD多线程详解
- swift3.0+GCD小小的尝试
- Swift3.0中GCD定时器的使用
- [绍棠_Swift] Swift3.0中的GCD
- Swift3.0学习
- swift3中的多线程GCD
- 在网页上生成由字母和数字组成验证码的简单实现
- mac 安装tesseract-ocr
- Ubuntu安装Code::Blcoks16.01
- 《肖申克的救赎》
- 微信小程序-仿开眼分类页
- Swift3.0 gcd学习(3)
- xshell无法链接ubuntu14.04系统
- 【备注】【C19】《数据结构与算法分析:Java语言描述(第2版)》PDF
- 1082. Read Number in Chinese (25)解题报告
- bzoj1692(后缀数组)
- 二分法找数
- 关于Ubuntu更新后无法开机的解决方案
- Tomcat1—怎么将maven生成的war 文件部署到Tomcat上
- 微信开发整合日记(3)