大家好,我是坤哥
不少读者私下对我说我的朋友圈很有价值,对他们的帮助很大,所以想了一下把一些有价值的思考提炼出来分享出来,希望对大家能有些帮助,也欢迎大家扫码加我好友,围观朋友圈,共同进步^_^
编程思维
- 「分析源码第一步,先看一下单元测试用例。因为,一般单元测试中,每一个用例就是测试代码中的一个局部或者说是一个小流程。那对于一些比较完善的开源软件,它们的单元测试覆盖率都非常高,很容易找到我们关心的那个流程所对应的测试用例。我们的源码分析,就可以从这些测试用例入手,一步一步跟踪其方法调用链路,理清实现过程。」摘自极客时间,说得不错l
- JAVA 网络,看到一个比喻挺不错的(有一些瑕疵,不过不影响整体理解),分享给大家: 例子:有一个养鸡的农场,里面养着来自各个农户(Thread)的鸡(Socket),每家农户都在农场中建立了自己的鸡舍(SocketChannel) 1、BIO:Block IO,每个农户盯着自己的鸡舍,一旦有鸡下蛋,就去做捡蛋处理; 2、NIO:No-Block IO-单Selector,农户们花钱请了一个饲养员(Selector),并告诉饲养员(register)如果哪家的鸡有任何情况(下蛋)均要向这家农户报告(select keys); 3、NIO:No-Block IO-多Selector,当农场中的鸡舍逐渐增多时,一个饲养员巡视(轮询)一次所需时间就会不断地加长,这样农户知道自己家的鸡有下蛋的情况就会发生较大的延迟。怎么解决呢?没错,多请几个饲养员(多Selector),每个饲养员分配管理鸡舍,这样就可以减轻一个饲养员的工作量,同时农户们可以更快地知晓自己家的鸡是否下蛋了; 4、Epoll模式:如果采用Epoll方式,农场问题应该如何改进呢?其实就是饲养员不需要再巡视鸡舍,而是听到哪间鸡舍的鸡打鸣了(活跃连接),就知道哪家农户的鸡下蛋了; 5、AIO:Asynchronous I/O, 鸡下蛋后,以前的NIO方式要求饲养员通知农户去取蛋,AIO模式出现以后,事情变得更加简单了,取蛋工作由饲养员自己负责,然后取完后,直接通知农户来拿即可,而不需要农户自己到鸡舍去取蛋。
- 在看 ConcurrentHashMap 源码,看到 helpTransfer 的方法时,被一个地方卡住了,联系上下文,想了半天,总感觉这里有问题
于是打开 https://bugs.java.com/bugdatabase/view_bug.do 搜了一下,果然是 bug!比较坑爹的是这个 bug 在 JDK 12 才解决,顺便感叹一句,搜了不少靠前的文章,都讲到这一段,但都没有发现这是 bug,怀疑还是很重要的,即便这是 Doug Lea 写的。源码要看,但要细看,指不定你哪天也在这上面提一下 bug,简历上可以增添一句:我是给 bugs.java.com 提过 bug 的男人,简历瞬间熠熠生辉