【高并发】导致并发编程频繁出问题的“幕后黑手”
![【高并发】导致并发编程频繁出问题的“幕后黑手”](https://static001.geekbang.org/infoq/5e/5ecc61077dc258be0dd42a9944e52491.png)
大家好,我是冰河~~
工作了 3 年的小菜同学,平时在公司只是做些 CRUD 的常规工作,这次,出去面试被面试官一顿虐啊!尤其是并发编程的知识简直就是被吊打啊。小菜心有不甘,回来找自己工作经验非常丰富的朋友大冰来帮助自己提升并发编程的知识,于是便有了接下来的一系列小菜学并发的文章。
![](https://static001.geekbang.org/infoq/3c/3cc61569b7a3f1cad70cafcc0d320076.jpeg?x-oss-process=image/resize,p_80/auto-orient,1)
![](https://static001.geekbang.org/infoq/8c/8cdb74b92aabac7fb73e0f0b901f1af8.jpeg?x-oss-process=image/resize,p_80/auto-orient,1)
![](https://static001.geekbang.org/infoq/d2/d2125ccec3f3ed5e3c65308c824ae859.jpeg?x-oss-process=image/resize,p_80/auto-orient,1)
![](https://static001.geekbang.org/infoq/78/7857076b4b7f6f60e6ee2016955756c3.jpeg?x-oss-process=image/resize,p_80/auto-orient,1)
![](https://static001.geekbang.org/infoq/69/691ea944eddea09943d6d2d7cac094e2.jpeg?x-oss-process=image/resize,p_80/auto-orient,1)
![](https://static001.geekbang.org/infoq/6d/6d12e60db5d1fefba144d970fdb07366.jpeg?x-oss-process=image/resize,p_80/auto-orient,1)
并发编程的难点
并发编程一直是很让人头疼的问题,因为多线程环境下不太好定位问题,它不像一般的业务代码那样打个断点,debug 一下基本就能够定位问题所在。并发编程中,出现的问题往往都是很诡异的,而且大多数情况下,问题也不是每次都会重现的。那么,我们如何才能够更好的解决并发问题呢?这就需要我们了解造成这些问题的“幕后黑手”究竟是什么!
![](https://static001.geekbang.org/infoq/6d/6d81cd5e4f0536b0b3c5dba428ebb978.jpeg?x-oss-process=image/resize,p_80/auto-orient,1)
操作系统做出的努力
计算机的制造商为了提升计算机的整体性能,对计算机做出了相应的优化措施。
CPU 增加了缓存
CPU 对于数据的计算速度远远高于从内存中存取数据的速度,我们可以想象一下,如果说,CPU 对于数据的计算需要一天时间,那么,从内存中读取和写入数据可能分别需要 1 年的时间。也就是说,在这一年 365 天当中,CPU 只需要工作一天,而 364 天的时间都在等待从内存中读取或者存储数据。这对于 CPU 的利用率来说,就是极大的浪费了。
![](https://static001.geekbang.org/infoq/2a/2a15f4d7e8b62a3541401fc2c3601f29.jpeg?x-oss-process=image/resize,p_80/auto-orient,1)
为了缓和 CPU 与内存之间的速度差异,计算机的制造商为 CPU 增加了缓存。
![](https://static001.geekbang.org/infoq/79/795b7dc17164c7b47ea470e56ee55039.jpeg?x-oss-process=image/resize,p_80/auto-orient,1)
操作系统增加了进程和线程
CPU 的速度比内存快的多,而内存又比磁盘快的多。如果说,CPU 运算需要一天的时间,从内存读取数据需要一年的话,那从磁盘读取数据就需要 10 年的时间了。没错,磁盘就是这么慢啊!
![](https://static001.geekbang.org/infoq/3d/3d43632cb34778df93da29eaba3b9338.jpeg?x-oss-process=image/resize,p_80/auto-orient,1)
为了缓和 CPU 和磁盘设备之间的速度差异,操作系统的制造商增加了进程和线程技术。
![](https://static001.geekbang.org/infoq/f7/f70e822b21f9c5c15805cdc8d0b5fcf9.jpeg?x-oss-process=image/resize,p_80/auto-orient,1)
优化 CPU 指令执行顺序
我们写的并发程序在操作系统上运行时,对于 CPU 缓存的使用可能会不太合理,造成 CPU 缓存的浪费。
![](https://static001.geekbang.org/infoq/51/518dce41c74ed3eb8aea94c0c53257d7.jpeg?x-oss-process=image/resize,p_80/auto-orient,1)
为了使 CPU 的缓存能够得到更加合理的利用,编译程序对 CPU 上指令的执行顺序进行了优化。
![](https://static001.geekbang.org/infoq/bd/bd64f501855bd13edd3a3ce5a0dc975e.jpeg?x-oss-process=image/resize,p_80/auto-orient,1)
揪出“幕后”黑手
计算机和操作系统的制造商对计算机和操作系统进行的优化,在无形当中造成了很多并发编程的问题。本质上,并发编程的很多诡异的问题源头也在于此,这也是并发编程频繁出问题的“幕后黑手”。所以,我们可以将“幕后黑手”总结如下。
![](https://static001.geekbang.org/infoq/0b/0bcc8d71fceda0b21fc5054788eeaceb.jpeg?x-oss-process=image/resize,p_80/auto-orient,1)
没错,这就是造成并发编程问题的“幕后黑手”!!后面我们将分别细化说明这些“幕后黑手”。
![](https://static001.geekbang.org/infoq/0a/0ae599c99684843305979e7e5c65cd97.jpeg?x-oss-process=image/resize,p_80/auto-orient,1)
![](https://static001.geekbang.org/infoq/21/2199936108c937f775ad435877f4ac74.jpeg?x-oss-process=image/resize,p_80/auto-orient,1)
![](https://static001.geekbang.org/infoq/52/52dd2618508b216cd519ac5c76754797.jpeg?x-oss-process=image/resize,p_80/auto-orient,1)
![](https://static001.geekbang.org/infoq/62/62c7a956582e62366e3148df94b1422d.jpeg?x-oss-process=image/resize,p_80/auto-orient,1)
总结
了解并掌握并发编程问题的“幕后黑手”,有助于我们更好的学习并发知识和解决并发问题。
如果觉得文章对你有点帮助,请微信搜索并关注「 冰河技术 」微信公众号,跟冰河学习高并发编程技术。
最后,附上并发编程需要掌握的核心技能知识图,祝大家在学习并发编程时,少走弯路。
![](https://static001.geekbang.org/infoq/a1/a12a38598332a9d9a3865fbaf3935376.jpeg?x-oss-process=image/resize,p_80/auto-orient,1)
版权声明: 本文为 InfoQ 作者【冰河】的原创文章。
原文链接:【http://xie.infoq.cn/article/267ee64be6c2237a0a5e0cbec】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论