我是y哥的读者,已经毕业几年了,一直在做业务开发,最近想要跳槽,自然就会读读y哥写的对线面试官系列,毕竟现在面试都得搞八股文啊。
花了一个晚上读了两个章节,分别是《Java基础》和《Java并发》,读完来吐槽一波
《Java基础》这个章节现在就4篇文章,说实话不太够看。其中《注解》《泛型》《反射和动态代理》都没什么好说的,都是以线上真实应用的角度介绍这些知识点,没什么八股文的内容,所以我一看就懂了。毕竟做了这么久的业务开发,这些多多少少都知道,应用场景也是符合线上所讲的。
唯一之前没注意到的就是在《注解》文章里,原来Lombok的原理就是在编译期里做的,抽象语法树那块做的“增强”而实现的。
看到《Java NIO》这个文章就又又回想起我初学NIO的时候了,确实现在工作几年我跟y哥一样在线上环境都没机会用NIO,也没用过NIO的封装Netty,没啥好讲的。
y哥以IO模型切入,然后说了IO复用模型这块(我知道这IO复用模型在开源框架层面上应用确实是很广泛,被问到的概率还是挺大的)。然后经典面试题:select和epollo的区别,什么是零拷贝。
唉,这些东西见一次忘一次,上次还记得,这次回看又感觉很陌生。
接下来就是并发了,当我看到一句:「进程作为资源分配的基本单位,线程作为资源调度的基本单位」我愣了一下。如果此时我直接去面试,面试官问我线程和进程的区别,我能不能答出这一句,恐怕是不能。。。
还有死锁那块,为什么会死锁我可能能答出来,但是解决死锁的思路可能我就只记得:获取锁的时候设置超时时间就好了,一定时间内获取不到直接放弃,这不就行了吗。我感觉线上大多数都是这么干的,虽然我在线上环境也没搞过。
什么固定加锁的顺序啊,减少锁的范围啊,这种不看是真答不出来。
CAS这个大部分都记得,没啥说的,应该最多考个ABA,而 LongAdder 和 AtomicLong 的区别,我怀疑y哥是凑字数写上去的,不过大概也知道一个思路。为什么某某的性能高?把粒度降低,那竞争锁的线程就没那么高,自然性能就上去了。
到了Synchronized呢,印象中还记得些JDK1.6锁升级的事,但细节真的是全忘了。什么mark word,什么监视器对象,什么lock record,真服了。在生产环境里印象中也没写过几次Synchronized这个关键字,idea不提示可能的忘了这个单词怎么拼了,还什么monitorenter和monitorexit指令。
AQS和ReentrantLock这个呢,大致的实现框架是还记得的,算又是复习了一把。但是具体的源码过程就是真的忘了,没想到获取一个锁原来有这么多步,我印象中不是这样的啊!
线程池这个没啥好说的,一般都是围绕几个核心的参数来讲讲他的运行过程,因为在线上环境也有好几个地方用到了线程池,所以这块没有忘太多,如果要我讲源码的话,也只能GG了,不过y哥也没写源码的内容
ThreadLocal这个玩意呢,应用开发用得不多,我所知道的可能在做日志组件的时候或许会有用到(之前看过y哥发他朋友的日志组件,看了下代码)。源码以前在校招的时候见过,也大概知道它的原理,也大概知道内存泄露这个知识点,但我不理解为啥这个能作为一个还算是高频的面试题,明明应用开发不会怎么用到的才对。
CountDownLatch和CyclicBarrier这东西我在线上环境重来没用过,我知道是干嘛的,以前也看过一次源码,但是真的忘没了。。算是复习一把吧,核心就是这张图;
Java内存模型这个就更离谱了,我在应用开发时从来没关心过里边的细节,我觉得Java就是为了不让我们去关注这些细节,然后定义了这个「规范」,而面试再回头问你为啥有这个规范,原因是啥,这个规范的内容是什么。
难顶,明天再刷后面的。