源码原理
jdk源码
ConcurrentHashMap
Java技术驿站.《【死磕 Java 集合】— ConcurrentHashMap源码分析》:http://cmsblogs.com/?p=4775
读写锁ReentrantReadWriteLock
日拱一兵.《搞定ReentrantReadWriteLock 几道小小数学题就够了》:https://www.toutiao.com/i6841710940157641224
-
基础 -> ThreadLocal,各种锁
-
集合+并发包-> HashMap,ConcurrentHashMap,CopyOnWriteArrayList
Spring&Spring boot
[芋道源码].《给你一份 Spring Boot 知识清单》 密码coke
bean加载流程
last read: http://svip.iocoder.cn/Spring/IoC-TypeConverter/
见《附录.spring getBean全流程》
AOP原理
Spring AOP 生成代理类的逻辑是在 AbstractAutoProxyCreator 相关子类中实现的,比如 DefaultAdvisorAutoProxyCreator、AspectJAwareAdvisorAutoProxyCreator 等。上面说了 BeanPostProcessor 为拓展留下了可能,这里 AbstractAutoProxyCreator 就将可能变为了现实。AbstractAutoProxyCreator 实现了 BeanPostProcessor 接口,这样 AbstractAutoProxyCreator 可以在 bean 初始化时做一些事情。光继承这个接口还不够,继承这个接口只能获取 bean,要想让 AOP 生效,还需要拿到切面对象(包含 Pointcut 和 Advice)才行。所以 AbstractAutoProxyCreator 同时继承了 BeanFactoryAware 接口,通过实现该接口,AbstractAutoProxyCreator 子类就可拿到 BeanFactory,有了 BeanFactory,就可以获取 BeanFactory 中所有的切面对象了。有了目标对象 bean,所有的切面类,此时就可以为 bean 生成代理对象了。 from 田小波的技术博客.Spring bean的生命流程
循环依赖处理
Spring循环依赖三级缓存是否可以减少为二级缓存?:https://segmentfault.com/a/1190000023647227
Spring源码的生命周期、循环依赖:http://baijiahao.baidu.com/s?id=1671801896456911448
- springmvc的自动数据绑定?
- springboot自动装配原理?
Spring事务
《Spring-事务的源码分析》:http://www.baowenwei.com/post/spring/spring-shi-wu-de-yuan-ma-fen-xi-qi#toc_4
springboot启动流程
-
首先创建 一个SpringApplication对象,在创建的过程中对资源进行获取:判断该应用应该是什么类型;使用SpringFactoriesLoader查找并加载注册所有有用的ApplicationContextInitializer和ApplicationListener到Spring容器中;获取main 方法的对象类
-
然后由创建出来的对象SpringApplication执行run方法
-
run方法的开始会启动一个时间监视器,统计项目启动所用的时间
-
初始化 ConfigurableApplicationContext上下文和Spring Boot 启动异常收集类集合
-
通过SpringFactoriesLoader从
META-INF/Spring.factories
中获取并实例化SpringApplicationRunListener类和调用他们的starting方法,用于通知他们“Spring Boot开始启动了” (SpringApplicationRunListener是只在Spring Boot 启动过程中接受不同时间点的事件的监听者,用于在Spring Boot 的run方法执行不同过程中监听执行不同的方法) -
创建并配置Spring Boot的环境配置 (注意这里会重新执行一次run方法,如果是debug的时候,需要留意这次run 方法不同于第一次的run)
-
打印Banner
-
创建Spring ApplicationContent 上下文类
-
创建 SpringBootExceptionReporter类,用于存放启动的时候错误信息
-
遍历调用 SpringApplicationRunListener的 contextLoaded()通知 所有SpringApplicationRunListener,告诉它们ApringContext加载完成。并加载ConfigurableEnvironment 和Configuration类 到Springcontext上下文中
-
调用ApplicationContext的refresh()方法,进行自动配置模块的加载,启动Tomcat容器,加载并初始化数据源,kafka 等中间件组件,执行 @Scheduled 注解 等
-
计时器停止计时;通知 SpringApplicationRunListenerSpring Boot 的上下文刷新完成了
-
查找实现了ApplicationRunner或CommandLineRunner接口的类,并执行 它们的 run方法
-
最后再遍历执行 SpringApplicationRunListener的 finished()方法,通知 Spring Boot 启动完成。如果有报错会抛出报错信息。
Mybatis
项目结构以及整体架构
芋道源码.《精尽 MyBatis 源码分析 —— 项目结构一览》:http://svip.iocoder.cn/MyBatis/intro/
SQL 的执行过程
田小波.《MyBatis 源码分析 - SQL 的执行过程》:http://www.tianxiaobo.com/2018/08/17/
插件机制
[田小波.《MyBatis 源码分析 - 插件机制》:http://www.tianxiaobo.com/2018/08/26
算法与数据结构
匹配字符串-KMP算法
掘金《别再暴力匹配字符串了,高效的KMP才是真的香!》https://juejin.cn/post/6844904153123143687
常用的位操作
labuladong.《 常用的位操作》:https://labuladong.gitee.io/algo
数据库
锁?事务?acid
事务
- 原子性(Atomicity): 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;
- 一致性(Consistency): 执行事务后,数据库从一个正确的状态变化到另一个正确的状态;
- 隔离性(Isolation): 并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;
- 持久性(Durability): 一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。
事务隔离级别
-
READ-UNCOMMITTED(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
-
READ-COMMITTED(读取已提交): 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。
-
REPEATABLE-READ(可重复读): 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
-
SERIALIZABLE(可串行化): 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。
MySQL InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ(可重读)。可以通过 SELECT @@tx_isolation;
命令来查看
Oracle数据的默认隔离级别是READ-COMMITTED(读取已提交)。
MVVC
MySQL-InnoDB-MVCC多版本并发控制:https://segmentfault.com/a/1190000012650596
博客园-酸萝卜别吃.《MVCC多版本并发控制器》:https://www.cnblogs.com/travellingcat/p/14459187.html
InnoDB实现MVCC的方式:
-
MVCC机制通过undo log链和ReadView机制来实现
-
事务以排他锁的形式修改原始数据
-
把修改前的数据存放于undo log,通过回滚指针与主数据关联
-
修改成功(commit)啥都不做,失败则恢复undo log中的数据(rollback)
聚簇索引 非聚簇索引
聚簇索引和非聚簇索引: https://www.cnblogs.com/jiawen010/p/11805241.html
MySQL的BTree索引使用的是B树中的B+Tree,但对于主要的两种存储引擎的实现方式是不同的
MyISAM: B+Tree叶节点的data域存放的是数据记录的地址。其索引文件和数据文件是分离的。在索引检索的时候,首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其 data 域的值,然后以 data 域的值为地址读取相应的数据记录。这被称为
非聚簇索引
。
InnoDB: 其数据文件本身就是索引文件。其表数据文件本身就是按B+Tree组织的一个索引结构,树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。这被称为
聚簇索引(或聚集索引)
。而其余的索引都作为辅助索引,辅助索引的data域存储相应记录主键的值而不是地址,这也是和MyISAM不同的地方。在根据主索引搜索时,直接找到key所在的节点即可取出数据;在根据辅助索引查找时,则需要先取出主键的值,再走一遍主索引。 因此,在设计表的时候,不建议使用过长的字段作为主键,也不建议使用非单调的字段作为主键,这样会造成主索引频繁分裂。
Mysql的explain关键字
可用于sql调优,确认是否用上索引。explain
包含的字段:
- id //select查询的序列号,表示查询中执行select子句或操作表的顺序,越大表示越先被执行
- select_type //查询类型,比如简单查询
simple
,有字查询,最外层就是primary
等等 - table //正在访问哪个表
- type //访问的类型,可看出是全表扫描
all
还是范围扫描range
- possible_keys //显示可能应用在这张表中的索引,一个或多个,但不一定实际使用到
- key //实际使用到的索引,如果为NULL,则没有使用索引
- key_len //表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度
- ref //显示索引的哪一列被使用了,如果可能的话,是一个常数,哪些列或常量被用于查找索引列上的值
- rows //根据表统计信息及索引选用情况,估算 SQL 要查找到结果集需要扫描读取的数据行数. 这个值非常直观显示 SQL 的效率好坏, 原则上 rows 越少越好
- extra //explain 中的很多额外的信息会在 Extra 字段显示
彻底搞懂 MySQL 的 explain:http://cmsblogs.com/?p=18355
JVM
jdk1.8(主) jdk1.7(次)
内存模型
《Java 内存区域详解》:https://gitee.com/SnailClimb/JavaGuide/blob/master/docs/java/jvm
垃圾回收+jvm参数
《最重要的JVM参数指南》:https://gitee.com/SnailClimb/JavaGuide/blob/master/docs/java/jvm/
逃逸分析
知乎.《JVM之逃逸分析 》: https://zhuanlan.zhihu.com/p/59215831
synchronized实现原理
Java技术驿站.《【死磕Java并发】—–深入分析synchronized的实现原理》: http://topjava.cn/article/1391297775492272128
Java技术驿站.《【死磕Java并发】—–synchronized 的锁膨胀过程》: http://cmsblogs.com/?p=5812
关于偏向锁:
偏向锁的一个特性是,持有锁的线程在执行完同步代码块时不会释放锁。那么当第二个线程执行到这个synchronized代码块时是否一定会发生锁竞争然后升级为轻量级锁呢? 线程A第一次执行完同步代码块后,当线程B尝试获取锁的时候,发现是偏向锁,会判断线程A是否仍然存活。如果线程A仍然存活,将线程A暂停,此时偏向锁升级为轻量级锁,之后线程A继续执行,线程B自旋。但是如果判断结果是线程A不存在了,则线程B持有此偏向锁,锁不升级。
volatile
Java技术驿站.《【死磕Java并发】—–深入分析volatile的实现原理》http://topjava.cn/article/1391297782668726272
架构师
-
架构理论 TODO: 架构设计原则案例:https://time.geekbang.org/column/article/7392
-
设计模式
Dubbo
- 服务暴露过程
- 服务调用过程
分布式知识
极客时间.《想成为架构师,你必须知道CAP理论》:https://time.geekbang.org/column/article/9302
微服务+springcloud
Redis
topjava.《死磕 Redis》:http://topjava.cn/article/1391390758589829120
w3cschool.《Redis开发运维实践指南》:https://www.w3cschool.cn/redis_all_about/
消息队列
kafka
《芋道 Kafka 极简入门》https://www.iocoder.cn/Kafka/install/
《kafka官方文档》:https://kafka.apachecn.org/intro.html
狂乱的贵公子.《随笔分类 - kafka》:https://www.cnblogs.com/cjsblog/category/1162040.html
coderap.《Kafka系列》: https://blog.coderap.com/articles/category/26
NIO
topJava.《Java 与 NIO》:http://topjava.cn/article/1389525243600703488
学习资料
附录
学习路线图
spring getBean全流程
from 芋道源码
发表评论