为啥并发编程,要从 JDK 源码里去学?

发布于:2023-01-22 ⋅ 阅读:(11) ⋅ 点赞:(0) ⋅ 评论:(0)

大家都学过哪些框架的源码?我猜,像 ZooKeeper、Dubbo、Spring Cloud、redisson、curator 等等这些,估计很多朋友都去看过了,是吧?

那你在抠这些源码的时候,有留意过自己都遇到过什么问题吗?

估计,很多人在「徜徉」源码世界的时候,是完全懵逼的状态,仅仅是为了看而看,但又发现很多地方实在是看不懂的。

一句话,就是基础太弱了。

有没有发现,在你读源码的时候,一些很基础性的代码逻辑,包括各种内存里的数据结构,还有并发、磁盘 IO、网络请求等等,估计你也没完全搞定是吧?

不说别的,单单是在并发编程领域,你要知道,考察更多的是开发者对于计算机底层原理的理解,特别是能够从 CPU 的角度出发找到问题根源的能力。

而且很多框架,企业里的自研组件的底层中,几乎都会涉及到并发编程的技术,如果说你不能掌握其底层实现技术的话,大概率在实际生产过程中,都会遇到一些很棘手的问题。

但很多人却是只停留在技术浅层,不管并发编程技术也好,还是其他技术的学习,其核心在于应用,并且有能力能构建起完善的、可以应对各种实际生产问题的知识体系。

不管是怎样的系统、多牛逼的技术,其实都好,说到最底层自己该去理解的,无非就两个:

  • 数据?(数据存放)
  • 如何操作数据?(并发、IO、网络)

数据的存放,靠的是容器,其实都是集合,可以在内存中存放数据。

在分布式系统中,并发将涉及到的多个线程,也就是看你接下来如何处理锁、同步等等问题了。

磁盘 IO,如何读写磁盘上的数据,如何发起网络 IO 读写数据等等。

在分布式系统中,如何搭建各个机器的网络连接,进而相互发送请求实现通信。

搞定上面的那些东西之后,你再去思考下一步的系统机制、系统的核心流程、系统架构设计、各个业务的实现、设计模式等等。

但有些朋友,就觉得「架构设计」很牛逼,疯狂又盲目地去套各种「优秀架构设计方法论」,但自己压根儿就不知道为啥要这样做。

所以,接下来,我建议大家一定要耐住寂寞,一定要好好把自己的基础搞好,否则一切都无从谈起。

你可以从 JDK 的源码入手,花点儿时间和精力,把基础性的技术,好好搞一搞。说是基础性技术,但不代表它容易,在 JDK API 底层都会遇到很多复杂的机制,包括并发、锁的底层原理、磁盘文件读写、网络等等内容,都不是特别容易理解的。

你回头想,你接触过的 ZooKeeper、Netty、Dubbo、RocketMQ、Sharding JDBC 等等优秀三方框架,哪一个的底层不涉及上面说的那些基础性技术?你如果仅仅是懂点儿皮毛的话,你就根本不可能研究地明白,这些优秀框架它到底是哪儿优秀了,你是不可能学得到其精髓的。

当然,我知道很多同学费尽心思是去研究源码,更多的还是为了在跳槽面试的时候,能更有把握些。很多公司,在面试的时候,都会去问 JVM、设计模式、集合、并发、IO、网络等等这些基础性技术的理解程度,主要是为了看看你的基础功底到底咋样。

但现实很残酷,很多人之前仅仅是会用,一旦深入问到细节的时候,就蒙圈了。不过没事儿,不懂就学,多么简单的道理,一点一点慢慢把它学好了就行,对吧。

怎么学呢?我分享几个建议,结合 JDK 中集合的源码:

第一,把原理搞懂,尽可能自己还能画图捋明白(可以画图讲给别人听);

第二,套入案例使用;

第三,深入源码细节,分析源码如何实现的?

再具体一些的话,我们分开来说说:

  • 在集合中,我们能接触的,无非是 List、Set、Map 这三种;
  • 并发的话,去搞定 JVM 中的基础知识,比如并发包的源码,可以看看;
  • 网络和数据读写,把网络、读写的基础知识和原理彻底搞懂,很重要;
  • 延伸一些优秀的产品,比如 Netty、Spring Cloud 等都是用得很广的产品,你看人家是怎么实现的。

那你还可以在自己搞熟基础知识后,可以再去看看 Spring Cloud Eureka 的服务注册中心的源码,可能会有更多收获喔,你看看人家是如何去使用集合、IO、网络、并发等等技术的,然后看懂了,你可以讲给旁边的人听,甚至可以自己模仿着去开发一个简易版的来玩玩儿,都是很好的学习方式。

甚至你有兴趣的话,还可以搭建一套可视化的线程池监控系统,比如你可以:

  • 线程池监控
  • 分布式链路 ID
  • 设计分布式锁
  • 本地缓存组件
  • ……

如果文章能帮到您,能帮我顺手点个赞、转发一下嘛?真心感谢、超级感谢!!!