通过本片文章,你可以了解到:
1 什么是并发编程
2 并发编程有哪些挑战
3 相关的解决方案
为啥要并发
在程序中,并发本质上是提高任务的执行效率,减低程序运行的时间。不多解释
并发遇到的挑战有哪些&&解决方案
上下文切换
首先要明确的就是即使是在单核cpu条件下,多线程也是支持的。从操作系统上来讲,CPU通过时间片机制来执行多线程。因为时间片很短,所以在我们看来是多线程并发执行,其实是cpu在内部根据时间片,在某一时间片时间结束后,保存当前线程状态,加载下一个线程之前的状态,然后在下一时间片时间内执行下一个线程的任务。保存当前线程状态,加载下一个线程的状态,其实就是上下文切换。
举例就是说,你看一本英文书,有个词不会,然后你去翻词典,查到这个词,然后再回来继续读。去翻词典然后再回来继续读,这样读书效率不高的。
上下文切换解决方案
本质上是减少上下文切换,或者是不使用系统切换。
- 无锁并发编程
- 多线程竞争锁的时候会进行上线文切换
- CAS算法
- CAS算法是无锁编程的一种算法
- 使用最小线程
- 使用最小的线程,以避免大量空闲线程等待浪费切换时间
- 使用协程
- 协程简单理解就是用户级的上下文切换,比系统上下文切换减少切换时间
死锁
作为开发,对于死锁肯定是不会陌生。如果你写的程序遇到了线程死锁,正常运行就有问题,更不用说并发来减少运行时间,反倒要延长时间。
死锁解决方案
其实就是减少死锁。
常见的有避免一个线程获取多个锁,使用定时锁(超过时间就释放掉)等等
资源限制
一台1核1G的服务器,可能最多支持同时跑40个线程,超过这个限制,cpu就会陷入疯狂切换上下文,也就执行不了实际的任务。或者说网络带宽是1M/s, 开多少线程也顶多下载速度是1M/s。
资源限制解决方案
两个方向
一是从程序上减少资源的浪费
二是增加资源
参考
《java并发编程的艺术》方腾飞 魏鹏 程晓明 著