关于JDK源码:我想聊聊如何更高效地阅读。海事

  

简介

  

大家好,我是彤哥,今天我想和大家再聊聊JDK源码的几个问题:

  
      <李>   

    为什么要看JDK源码

      李   <李>   

    JDK源码的阅读顺序

      李   <李> JDK源码的阅读方法   
  

为什么要看JDK源码

  

一、JDK源码是其它所有源码的<>强基础强,看懂了JDK源码再看其它的源码会达到事半功倍的效果。

  

二,JDK源码中包含大量的<>强数据结构知识,是学习数据结构很好的资料,比如,链表,队列,散列表,红黑树,跳表,桶,堆,双端队列等。

  

三,JDK源码中包含大量的<强>设计模式强,是学习设计模式很好的资料,比如,适配器模式,模板方法模式,装饰器模式,迭代器模式,代理模式,工厂模式,命令模式,状态模式等。

  

三,JDK源码中包含大量Java的<强>高阶知识强,比如弱引用,安全,中科院,锁原理,伪共享等,不看源码是很难学会这些知识的。

  

四、面试时更好地<强>收割提供,这可能是很多同学最初的想法,其实真正看多了源码,这一点可能并不是太重要了,因为你会发现更广阔的世界。

  

五,彤哥认为最重要的,阅读源码是对思维的一种锻炼,是学习优秀设计的<>强最佳途径强,本文来源于工从号彤哥读源码。

  

JDK源码的阅读顺序

  

首先,JDK源码我分成了以下几个部分:

  

基础类

  

<>强基础类强,是指组成JDK源码地基的一部分类。

  

比如包装类,反射类,工具类等,这些类有个共同点,就是代码逻辑相对简单,不存在数据结构,复杂运算等问题。

  

<强>对于基础类强,彤哥的建议是自己从头到尾浏览一遍,对于看不懂的地方可以写测试用例或者上网查查资料。比如,整数里面有个IntegerCache内部类你可能不知道干嘛的,这时候光看代码是没用的,只能上网查查资料了,也不能盲目地死磕。

  

简单集合

  

<强>简单集合强,是指不存在多线程安全问题的集合。

  

这部分集合一般用在单线程中,或者方法体中,但是他们用到了很多的数据结构,所以需要一定的数据结构知识。

  

<强>对于简单集合强,彤哥的建议是先弄明白底层的数据结构知识,再去看源码,这样可能会轻松一些。当然,彤哥后面也会出数据结构系列的。

  

原子类

  

<强>原子类强,是指在多线程环境下能够保证原子性的类。

  

这部分类主要包括原子*开头和*加法器结尾的类,位于juc下面的原子包中。

  

<强>对于原子类强,彤哥的建议是先去了解底层的安全,中科院,伪共享等概念,再去看最简单的AtomicInteger,最后再看LongAdder这种复杂的类,其中,断点调试是不可或缺的手段。

  

说句实话,LongAdder这个类能学到很多高阶的知识,非常推荐把这个类研究透彻,后面再去看粉碎机,网状的等源码会事半功倍。

  

同步器

  

<强>同步器强,是指为了控制多个线程的竞争关系而存在的类或者关键字等,本文来源于工从号彤哥读源码,它们可以说是Java中最重要的内容,没有它们就无法控制多线程的正常运转。

  

这部分内容主要包括同步关键字,动荡的关键字,重入锁,读写锁,倒计时器,信号量,回环栅栏,阶段器,分布式锁的实现等等。

  

<强>对于同步器强,彤哥的建议是先了解内存模型,可见性,原子性,有序性,之前等基本概念,再尝试阅读这部分的源码,最后再归纳出属于你自己理解的“同步器的原理”。

  

并发集合

  

<强>并发集合强,是指多线程环境下能够保证数据一致性的集合。

  

这部分集合主要是运用在多线程环境下,只有极个别类牵涉到高级的数据结构,更多的是锁,中科院,波动,自旋等高阶技巧的运用。

  

<强>对于并发集合强,彤哥的建议有三点:

  
      <李>   

    一定要在同步器之后阅读

      李   <李>   

    数据结构先搞透,比如ConcurrentSkipList

      李   <李>利用想法的线程级别的断点,不断调试,不断调试,不断调试李   
  

线程(池)类

  

<强>线程(池)类强,是指跟线程和线程池相关的类。

  

这部分类主要包含线程,ThreadLocal,三种线程池等。

  

<强>对于线程(池)类强,彤哥的建议是先从整体上把握,再分成几个块来看,看哪块的东西就只看那块的东西,不要管其它的代码,即要搞清楚你的重点在哪里,比如,看线程运行的流程就不要管状态的事,凡是牵涉到状态的代码全部跳过,反之亦然,都看完了,再串一起看。

关于JDK源码:我想聊聊如何更高效地阅读。海事