高级JAVA知识图及JUC讲解(看懂学半年进大厂无压力)
- 并发
- 时间:2020-06-16 21:14
- 6042人已阅读
🔔🔔🔔好消息!好消息!🔔🔔🔔
有需要的朋友👉:联系凯哥
知识框架梳理
核心知识框架图
以前待过一个公司,然后公司领导特别nice,10几年的大厂经验,然后技术也特别扎实全面,我们从他那边学到很多东西,
但是他教给我们有价值的干货,还得属于2017年年终review时候的分享的学习方法,我们知道授人予鱼不如授人予渔,无可
置疑,get到学习的method比get到属性有价值得多。
其实,他教我们学习java的办法很简单,总结来说就是两句话,一句是,维护一个属于自己的知识框架图,第二句
隔三差五去看看你所记的东西。看到这里,你肯定觉得这种方法很小儿科,这种low B方法你早就get到了,或者说
你高中初中就一直在用了,但是我们要知道,正是这种返璞归真的方式,才是最好用的办法~为什么这么说呢,下
面我们来看一下艾宾浩斯记忆曲线吧~通过下面的遗忘曲线我们看到的知识点在没有复习的情况下,15天后从百分
之100下降到了百分之五不到,基于艾宾浩斯记忆曲线,我们会发现了复习知识点的价值所在。举个例子,
当你要面试别人或者要参加面试的时候,你会花很多很多时间来复习你平常积累的知识点,特别是参加面试的
准备时间,这个时间少则两三个月,多则半年,视人而定,但是如果你将知识点放到你的xmind知识框架图上面,
你会发现只需要花半个小时快速充电就能把之前看的知识点重新记起来了。
知识框架梳理
上面是本人的知识框架图,这里有非常凌乱的知识点,但是总结来说有由几个方面组成
java虚拟机相关知识
java并发juc相关知识
分布式事务、分布式系统全家桶,rocketmq队列,dubbo远程rpc,netty知识等
ssm相关知识
数据库相关知识(关系型数据库/非关系型数据库)
运维相关知识,linux、tcp、http等
核心知识框架图
那么这些知识点是怎么积累进来的呢,下面我以JUC的学习过程为例子来讲解我的知识框架图记录过程,
首先我们知道,JUC就是java.util.concurrent包,俗称java并发包,那首先我们要知道java并发包是用来干嘛
的,然后要知道java并发包包括哪些知识点,这些知识点在平常中有哪些重要的运用,简单来说,这个学习
方法就三个点,是什么?为什么?怎么办?
上面是JUC的地址,JUC位于rj.jar中,大家知道rj.jar属于bootstrap classloader加载的内存,通过双亲委派机制去加载
其到我们JVM的方法区中使用,通过查看JUC的结构,我们会发,JUC下面有两个子包,分别是atomic和locks,
atomic即原子类,说到这个东西可牛逼了,CAS,说到这三个字母,相信大家不陌生了吧,打开这个package,然后把
源码看懂,你说发现其实就是这么回事,但是把这个技能get到,基本上面试官已经没法在CAS里面难得倒你了,我们
发现此包经常用到的类AtomicBoolean、AtomicInteger、AtomicLong、AtomicReference、AtomicStampedReference等,
然后打开源码包我们可以看到其实这些方法是调用Unsafe类提供compareAndSwapObject、compareAndSwapInt、compareAndSwapLong等方法,Unsafe类又是什么鬼呢,这个东西可就厉害了,他的全称是sun.misc.Unsafe,这个类是
属于JNI的类,Unsafe里面的native方法直接操作内存,getUnfate()仅供高级的Bootstrap类加载器使用,其实就是直接操作
CPU吗,那么,compareAndSwap这个鬼东西也就变得很浅显了,其实就是调用了CPU的系统原语,系统原语简单来说就是
CPU的一个不能再分割指令,所以比较和执行是在CPU原子操作的,而不是像之前一样,从工作内存考呗到执行引擎,
这里就不是一个命令那么简单,所以CPU搞定的事情就是要比考呗再去执行要靠谱。AtomicInteger、AtomicLong的compareAndSet、AtomicReference基于unsafe.compareAndSwapInt和unsafe.compareAndSwapLong和unsafe.compareAndSwapObject,那么AtomicStampedReference又是用来干嘛的呢,看了之后发现端倪了,其实他就是用来解决
ABA问题,AtomicStampedReference原子类是一个带有时间戳的对象引用。
下面我们在来看看并发包里面的locks package里面的知识,这里面有什么呢,这个package里面的核心
其实就是AbstractQueuedSynchronizer,这个鬼东西也有个牛逼霸气的名字,AQS,相信大家听到这个名字
就并不陌生了吧,lock的实现我们比较常见的有ReentrantLock(重入锁),ReadWriteLock读写锁等,
那么锁又是怎么实现的呢,我们先从AQS的源码入手去看,会发现AbstractQueuedSynchronizer有个核心的
内部类就做Node,Node里面有EXCLUSIVE,SHARED两种模式,即共享和独占,而我们的锁Lock和Sychronized
都是属于独占锁,这个类里面有两个核心的方法,一个是tryAcquire,一个是tryRelease,我们发现这两个
方法是用protected修饰的,再看看ReentranLock的源码,我们会发现其实重入锁是实现了tryAcquire和
tryRelease实现的~具体细节可以自己查看。
前面我们讲解了CAS和AQS这两个东西,后面我们再来讲讲另外一个东西吧,Synchronized,相信大家对它还是挺熟悉
的吧,那它又是怎么实现的呢,它的实现原理和lock比较相似,但是又存在差异,它是由monitor管程去的ObjectMonitor来
实现请求和等待的,ObjectMonitor中有两个队列,_WaitSet 和 _EntryList,用来保存ObjectWaiter对象列表( 每个等待锁的线程都
会被封装成ObjectWaiter对象),_owner指向持有ObjectMonitor对象的线程,当多个线程同时访问一段同步代码时,首先会进入
_EntryList 集合,当线程获取到对象的monitor 后进入 _Owner 区域并把monitor中的owner变量设置为当前线程同时monitor中的计
数器count加1,若线程调用 wait() 方法,将释放当前持有的monitor,owner变量恢复为null,count自减1,同时该线程进入 WaitSet
集合中等待被唤醒。若当前线程执行完毕也将释放monitor(锁)并复位变量的值,以便其他线程进入获取monitor(锁)。准确来讲上面
讲的属于Synchronized重量级锁的实现部分,Synchronized在进行重量级锁之前会先历经,偏向锁,轻量级锁和自旋锁,不直接
切换成重量级锁的原因是重量级锁需要进行操作系统Mutex Lock来实现,线程之间的切换需要从用户状态到核心态。
前面讲解的是java并发包里面的CAS和AQS和Synchronized,了解完这些知识点我们对并发包已经一定理解,但是并发包除了这些之外还有很多知识。比如tools工具,executor多线程相关类库,还有collections java集合类的并发实现等。
那么基于我们对JUC的学习和了解我们可以将其总结为刚刚的几个点,这样子我们就可以来做我们的知识框架图了,比如
我们对某个知识点理解欠缺深入就可以针对的将其列入框架图中,下面是适用于本人的JUC知识框架图
http://ddrv.cn/a/36370/amp
上一篇: 修改