evasnowind

9月 212020
 

我个人觉得,学习源码的姿势,首先是需要知道想学习的框架/工具如何使用,然后接下来再去看源码注释,看看当时代码作者是如何阐述代码的,再去看代码怎么编写,效果才最佳。

同样的,接下来要分析的线程池,首先用途自不必说,不管有没有用过,ThreadPoolExecutor的运行机制、传说中的7个参数(核心线程数corePoolSize、最大线程数maxPoolSize、等待时间keepAliveTime、时间单位timeUnit、阻塞队列blockingQueue、线程工厂threadFactory、拒绝策略rejectHandler),相信大家都已经熟练掌握,此处不再赘述。

接下来简单过一下ThreadPoolExecutor的注释。
Continue reading »

9月 172020
 

前言

本文所涉及spring/spring boot代码,请参考spring boot 2.2.6对应版本。

我们在刚学习spring boot时,有没有一个困惑:spring boot能够自动实例化很多第三方的依赖库?比如eureka、druid等。这个就涉及到spring boot的扩展机制spring factories。

简单来将,spring factories类似与Java SPI机制,利用该机制,我们能够自定义实现一些SDK或是spring boot starter,其实例化过程由我们来实现,使用方只需要在项目中引入包、不需要或是只需做很少的配置。

Spring Factories的核心

spring factories机制核心在spring-core包中定义的SpringFactoriesLoader类,该类的公有方法只有2个:
Continue reading »

9月 112020
 

说明

本文基于Apache Kafka 2.5.1(2020.09.10拉取最新代码)

Consumer如何使用?

阅读源码前的首先要做到熟悉相关组件的概念、基本使用。而最靠谱的资料就是官方文档。

建议阅读官方文档(https://kafka.apache.org/documentation/)后,自己练习、使用kafka之后再开始阅读源码。 Continue reading »

9月 092020
 

不得不说的Reactor模式

提到Netty,就必须先说一下Reactor模式,源头应该是Doug Lea大神(学java的如果不知道这位神的请自己反思一下……)的Scalable IO in Java所提出的Multiple Reactors模式,参见下图

如果想知道为何出现Reactor模式,需要将IO发展过程,都说一下可能才会比较清晰,此处就不一一展开,有兴趣的童鞋可以参考这篇帖子:Reactor模式 Continue reading »

8月 182020
 

预备知识

  • 计算任务的分类

    • CPU密集型:需要线程长时间进行的复杂的运算,这种类型的任务需要少创建线程,过多的线程将会频繁引起上文切换,降低任务处理处理速度。

    • IO密集型:由于线程并不是一直在运行,可能大部分时间在等待 IO 读取/写入数据,增加线程数量可以提高并发度,尽可能多处理任务。

  • JDK线程池,java.util.concurrent.ThreadPoolExecutor 传说中的7个参数,作用,线程池运行机制,参见下图复习

Continue reading »

7月 242020
 

按官方提示https://github.com/naver/pinpoint-docker ,通过docker安装pinpoint时,遇到端口冲突问题

 docker-compose up -d                                                                                                                                                                                             
Creating network "pinpoint-docker_pinpoint" with driver "bridge"                                                                                                                                                   
Creating pinpoint-docker_zoo3_1    ... done                                                                                                                                                                        
Creating pinpoint-docker_zoo2_1    ... done                                                                                                                                                                        
Creating pinpoint-flink-jobmanager ... done                                                                                                                                                                        
Creating pinpoint-docker_zoo1_1     ... done                                                                                                                                                                       
Creating pinpoint-mysql             ... done                                                                                                                                                                       
Creating pinpoint-hbase             ... error                                                                                                                                                                      
Creating pinpoint-flink-taskmanager ... done                                                                                                                                                                       
                                                                                                                                                                                                                   
ERROR: for pinpoint-hbase  Cannot start service pinpoint-hbase: Ports are not available: listen tcp 0.0.0.0:2180: bind: An attempt was made to access a socket in a way forbidden by its access permissions.       
                                                                                                                                                                                                                   
ERROR: for pinpoint-hbase  Cannot start service pinpoint-hbase: Ports are not available: listen tcp 0.0.0.0:2180: bind: An attempt was made to access a socket in a way forbidden by its access permissions.       
Encountered errors while bringing up the project.                                                                                                                                                                  

根据官方提示,修改pinpoint-docker文件夹下的.env文件,修改hbase端口即可,比如我修改为了12180 Continue reading »

7月 152020
 

明确目标

进入互联网行业,不管是实习,还是正式工作,要记住,从入行这一刻起,就要不停的学习、不停的思考,最好是根据自己的优缺点、喜好,订个明确的目标,自己到底想走哪条路线,是纯技术路线、不想太关心业务?产品经理?程序员只是过渡、想走管理?还是在互联网公司捞几年钱然后就转行?

  • 对技术特别感兴趣:那毫无疑问,技术这条路,其实也没有上限,你可以去极客时间app上看看那些大牛们

制定计划、逐步实行

听起来有点土、老生常谈了对吗?但我觉得这个当真是最朴实、最简单、也最实用的道理。

我目前在某央企、某互联网公司都做过程序员这个岗位。互联网行业,给我最大感触就是变化快、对于程序员的要求也越来越高,各种红利基本已经耗尽,前些年很多人看程序员赚钱、纷纷转行做程序员,这个恐怕后续会越来越难,从面试所考察内容就有直观感受,虽然每年大家都会说“互联网寒冬”、公司难,但从2019年年末开始,明显考察的内容越来越深、难。比如有如下一些题目(下面主要以java程序员举例,毕竟需求量大): Continue reading »

5月 272020
 

从一道面试题讲起:采用DCL实现单例模式时,是否需要加volatile关键字?为什么?

有关单例模式

我们在网上搜如何实现单例模式时,帖子往往给出多种实现:饿汉模式、懒汉模式、双重锁懒汉模式(双重锁检查,double check lock,经常简写做DCL)、静态内部类模式、枚举模式等。

此处可以参考 深入理解单例模式:静态内部类单例原理 这篇文章。

顺带提一句,《Java并发编程的艺术》(方腾飞)第3章有讨论过DCL、静态内部类这两种实现方式,建议去读一读。 Continue reading »