【高并发】导致并发编程频繁出问题的“幕后黑手”

简介: 工作了3年的小菜同学,平时在公司只是做些CRUD的常规工作,这次,出去面试被面试官一顿虐啊!尤其是并发编程的知识简直就是被吊打啊。小菜心有不甘,回来找自己工作经验非常丰富的朋友大冰来帮助自己提升并发编程的知识,于是便有了接下来的一系列小菜学并发的文章。

工作了3年的小菜同学,平时在公司只是做些CRUD的常规工作,这次,出去面试被面试官一顿虐啊!尤其是并发编程的知识简直就是被吊打啊。小菜心有不甘,回来找自己工作经验非常丰富的朋友大冰来帮助自己提升并发编程的知识,于是便有了接下来的一系列小菜学并发的文章。



微信图片_20211118121810.jpg


微信图片_20211118121812.jpg


微信图片_20211118121814.jpg


微信图片_20211118121816.jpg


微信图片_20211118121819.jpg


并发编程的难点

并发编程一直是很让人头疼的问题,因为多线程环境下不太好定位问题,它不像一般的业务代码那样打个断点,debug一下基本就能够定位问题所在。并发编程中,出现的问题往往都是很诡异的,而且大多数情况下,问题也不是每次都会重现的。那么,我们如何才能够更好的解决并发问题呢?这就需要我们了解造成这些问题的“幕后黑手”究竟是什么!

微信图片_20211118121824.jpg


操作系统做出的努力

计算机的制造商为了提升计算机的整体性能,对计算机做出了相应的优化措施。

CPU增加了缓存

CPU对于数据的计算速度远远高于从内存中存取数据的速度,我们可以想象一下,如果说,CPU对于数据的计算需要一天时间,那么,从内存中读取和写入数据可能分别需要1年的时间。也就是说,在这一年365天当中,CPU只需要工作一天,而364天的时间都在等待从内存中读取或者存储数据。这对于CPU的利用率来说,就是极大的浪费了。

微信图片_20211118121826.jpg


为了缓和CPU与内存之间的速度差异,计算机的制造商为CPU增加了缓存。

微信图片_20211118121828.jpg

操作系统增加了进程和线程

CPU的速度比内存快的多,而内存又比磁盘快的多。如果说,CPU运算需要一天的时间,从内存读取数据需要一年的话,那从磁盘读取数据就需要10年的时间了。没错,磁盘就是这么慢啊!

微信图片_20211118121830.jpg


为了缓和CPU和磁盘设备之间的速度差异,操作系统的制造商增加了进程和线程技术。

微信图片_20211118121832.jpg


优化CPU指令执行顺序

我们写的并发程序在操作系统上运行时,对于CPU缓存的使用可能会不太合理,造成CPU缓存的浪费。

微信图片_20211118121834.jpg


为了使CPU的缓存能够得到更加合理的利用,编译程序对CPU上指令的执行顺序进行了优化。

微信图片_20211118121836.jpg


揪出“幕后”黑手

计算机和操作系统的制造商对计算机和操作系统进行的优化,在无形当中造成了很多并发编程的问题。本质上,并发编程的很多诡异的问题源头也在于此,这也是并发编程频繁出问题的“幕后黑手”。所以,我们可以将“幕后黑手”总结如下。


微信图片_20211118122214.jpg

没错,这就是造成并发编程问题的“幕后黑手”!!后面我们将分别细化说明这些“幕后黑手”。

微信图片_20211118122228.jpg微信图片_20211118122223.jpg




微信图片_20211118122234.jpg


微信图片_20211118122239.jpg


总结

了解并掌握并发编程问题的“幕后黑手”,有助于我们更好的学习并发知识和解决并发问题。

最后,附上并发编程需要掌握的核心技能知识图,祝大家在学习并发编程时,少走弯路。

微信图片_20211118122247.jpg

相关文章
|
7月前
|
并行计算 Go 数据处理
掌握Go语言:Go 并发编程,轻松应对大规模任务处理和高并发请求(34)
掌握Go语言:Go 并发编程,轻松应对大规模任务处理和高并发请求(34)
|
缓存 负载均衡 算法
我佛了!Java开发者福音:并发编程源码剖析+高并发系统搭建
多线程和高并发的关系和区别 “高并发和多线程”总是被人一起提起,给人感觉两者好像相等,实则 高并发 ≠ 多线程 多线程 多线程是Java的特性,因为现在cpu都是多核多线程的,可以同时执行几个任务,为了提高jvm的执行效率,Java提供了这种多线程的机制,以增强数据处理效率。多线程对应的是cpu,高并发对应的是访问请求,可以用单线程处理所有访问请求,也可以用多线程同时处理访问请求。
|
缓存 监控 网络协议
并发编程-26 高并发处理手段之服务降级与服务熔断 + 数据库切库分库分表
并发编程-26 高并发处理手段之服务降级与服务熔断 + 数据库切库分库分表
113 0
|
消息中间件 算法 Dubbo
并发编程-25 高并发处理手段之消息队列思路 + 应用拆分思路 + 应用限流思路
并发编程-25 高并发处理手段之消息队列思路 + 应用拆分思路 + 应用限流思路
120 0
|
缓存 NoSQL Redis
并发编程-24 高并发处理手段之扩容思路 + 缓存思路
并发编程-24 高并发处理手段之扩容思路 + 缓存思路
104 0
|
Java
【高并发】InterruptedException异常会对并发编程产生哪些影响?
当我们在调用Java对象的wait()方法或者线程的sleep()方法时,需要捕获并处理InterruptedException异常。如果我们对InterruptedException异常处理不当,则会发生我们意想不到的后果!
201 0
【高并发】InterruptedException异常会对并发编程产生哪些影响?
|
消息中间件 缓存 安全
一起来认识Java 并发编程与高并发
一起来认识Java 并发编程与高并发
|
存储 设计模式 Java
【高并发】并发编程到底应该学什么?一张图秒懂!!
在【高并发专题】中,我陆续发表了一些高并发编程的知识,同时,也将高并发编程的文章整理成了一部392页共36W字的超硬核PDF文档——《深入理解高并发编程(第1版)》,目前,这份文档是全网最牛的开源免费的高并发编程PDF,累计下载量突破6W+。 很多读者留言说,不知道并发编程究竟应该学习什么。其实,学习技术需要掌握其原理和精髓,所谓万变不离其宗,只要我们掌握了最基本的原理,任凭其上层的应用和框架如何变化,我们都能够迅速掌握!! 并发编程学什么?
267 0
【高并发】并发编程到底应该学什么?一张图秒懂!!
|
安全 算法 Java
【高并发】学好并发编程,需要掌握这些核心知识体系!!
很多小伙伴问我:我在大学时候就学习了多线程,工作后,自己也看过不少有关多线程和并发编程的书籍和视频,为啥真正到工作的时候,我还是不知道在项目中哪里会用到并发编程。我知道有关于并发编程的各个知识点,但是没办法将这些知识点串起来,形成知识体系。冰河,你能不能推一篇文章,讲讲如何学习并发编程,如何将并发编程的各个知识点串成知识体系呢?今天,我们就一起来探讨下有关于并发编程的核心知识体系。
173 0
【高并发】学好并发编程,需要掌握这些核心知识体系!!
|
5月前
|
监控 算法 Java
企业应用面临高并发等挑战,优化Java后台系统性能至关重要
随着互联网技术的发展,企业应用面临高并发等挑战,优化Java后台系统性能至关重要。本文提供三大技巧:1)优化JVM,如选用合适版本(如OpenJDK 11)、调整参数(如使用G1垃圾收集器)及监控性能;2)优化代码与算法,减少对象创建、合理使用集合及采用高效算法(如快速排序);3)数据库优化,包括索引、查询及分页策略改进,全面提升系统效能。
58 0