如何读源码

      • 前言
      • 源码阅读原则

前言

读源码很难,难的是在于理解别人的思路,读自己的源码以及和自己思路类似的人的源码很容易。读源码需要具备数据结构基础和掌握设计模式。这样读起来才不会费劲。假如你想去读PriorityQueue的源码,但你连PriorityQueue是什么都不知道,何必这么折磨自己呢。正所谓万丈高楼平地起,数据结构和设计模式是必备掌握的基础内容。

源码阅读原则

对于如何阅读源码,首先代码跑不起来的不读,因为只有代码跑起来,点进去的源码和原来点进去是不一样的,原来点进去的可能是父类,可能是抛出了一个异常方法,但跑起来后的源码是实现了父类的子类源码。其次,如果在开发过程中遇到实在读不懂的源码,不要去尝试一遍又一遍去读,没有任何意义,费时又费劲。对于工作而言,解决了问题就好,这是我们的目的。

但即使这样,读源码还是会很费事费劲,这是很正常的。但是只要你开始读了,你就会越读越顺,越读水平越高,越读你就从小河边长到了天宫。就如口红的各种色号你开始熟悉了。

接下来就是读源码的时候建议尝试去画图,画图可以很好的帮助你分析源码,最好是uml图。当然不一定非得是UML,只要自己能画清楚,能看懂,能理解那就是好的。画了这个图你才能更好的理解这个流程是怎样的。

读源码的时候无关细节要忽略,切忌从头到尾读下去,所有源码全读一遍,这样读起来是非常费劲的,实在没有必要,也不是好的方法。

前面说过在阅读源码的时候画图,画两种图就行,第一种是方法之间的调用图,第二种就是类图。

最后,读源码最重要的就是要去读,画图只是让我们分析的更为透彻,助于理解。

AQS的底层是CAS+volatile,下面是AQS原理之一,这里只取了核心方法出来。

ReentrantLock r = new ReentrantLock();
 public ReentrantLock() {sync = new NonfairSync();}
static final class NonfairSync extends Sync { nonfairTryAcquire(acquires);}
final boolean nonfairTryAcquire(int acquires) {setState(nextc);}
private volatile int state;protected final void setState(int newState) {state = newState;}