vlambda博客
学习文章列表

系统学Java底层,是大多数Java初学者都会走的弯路

这样说吧,系统学Java底层,是大多数Java初学者都会缴的智商税。为什么这样说呢?

1 初级开发做的是增删改查 ,没必要了解底层,了解了对开发帮助也不大。

2 中级开发要求的是熟悉业务,能排查大多数问题,这时也无需系统学习底层技能。

3 架构师确实要熟悉各种分布式组件或Java组件的底层,但程序员先得升级到架构,才有必要去掌握底层技能。

4 底层技能唯一的用处是面试,java程序员可以通过准备和说明底层技能在面试中充分展示技能,但这无需系统学习,在面试前顶多用两三周时间死记硬背即可。

先说下,什么是Java的底层?在写代码时总要通过import语句引入所用的包,底层就包含在这些引入的jar包里。

1 针对Java核心库,比如HashMap,ArrayList或ConcurrentHashMap,或者是多线程锁相关的,底层源码是包含在JDK1.11的库里,比如是上述类的实现细节代码。

2 针对Spring Boot或Spring MVC,比如日常说的,Bean加载生命周期,Spring boot启动或装载模式,能从底层么里看到。

3 针对分布式组件,比如dubbo或netty或Spring Cloud alibaba里的诸多组件,底层是指在对应jar包里的代码或配置等实现细节。

再说下底层源码究竟对程序员有什么帮助?

1 比如是针对只需做业务的初级或高级开发,哪怕了解了100个1000个底层类的代码后,其实对开发帮助并不大。

比如看了快速失效的底层源码,顶多就知道别一边用迭代器遍历集合对象一边修改,看了spring boot启动类的底层源码后,该怎么实现业务还怎么实现。在这个阶段由于无法实际地从底层源码层面得到有效的帮助,而且底层源码大多很复杂,所以基本看了就忘。

2 而架构师确实要接触到底层源码。比如从如下的大牛文章里,大家能看到通过阅读分析底层源码而解决实际问题的一般步骤。




但是在这过程中,是有针对性地,通过查看和debug jar包里的源码来解决实际问题。这其实和大多数认为的,全方位铺开看源码是不同的。比如就是照着教科书把linux底层源码都看一遍,不针对问题去看,依然没用。

从中大家其实已经能看到,学习java底层技能或底层源码,不能说一点用处也没,但帮助还真不大。再进一步讲,对程序员有帮助的,还真是一些经验,还真不是源码和底层。

1 比如知道把线程池的等待队列 设成无界的,可能会导致OOM问题。

2 比如知道ArrayList是线程不安全的,在一些极个别需要线程安全的场景,可以用锁。

3 比如知道可以通过dubbo的优雅停机接口在避免问题,比如知道可以通过kafka的重发机制能避免消息收不到。

虽然在看了底层源码后,能进一步理解上述结论,但不看底层,在实际项目里实践多了,解决的问题多了,效果其实还真是一样的。

至于架构师级别通过看底层解决问题,只不过是排查问题的能力和分布式组件方面的能力提到到一定的程度水到渠成而已,并不是说程序员通过看源码能升级到架构师,因果不能倒置。

但是java底层知识如果合理地用在面试场景,一定能提升成功的可能。

1 初级开发能结合ArrayList+快速失效的底层源码,一定能证明自己熟悉Java核心技能。

2 初级开发还能通过volatile和ConcurrentHashMap源码,高效过面试。具体方式可以看我的如下文章里。



3 初级开发可以通过ThreadLocal的底层源码,尤其是其中的Weak引用,高效地展示JVM技能。

4 至于分布式组件方面,通过底层源码展示问题的点就太多了,比如Redis处理失效的源码,Dubbo处理超时和服务暴露的源码,netty半包粘包的源码,只要抛出一些,说难听点,哪怕是不大熟悉分布式组件技能的求职者,也能很好展示分布组件的技能。

也写这么多了,做个总结。

1 Java程序员其实没有必要全面铺开去了解底层技能,有这个时间有这个精力,还真不如去看分布式和微服务组件。

2 一定是有针对性地去看底层技能,比如遇到dubbo问题,通过debug到具体的class包里去分析,这样的问题解决多了,底层技能自然就掌握了。

3 面试时一定得充分利用底层技能展示实力,这比空口说熟悉组件熟悉技能要强得多。