页面加载中...

技术栈 - To be top coder

| 默认分类 | 0 条评论 | 740浏览

源码原理

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】—— IoC 之加载 Bean:创建 Bean(五)之循环依赖处理:http://svip.iocoder.cn/Spring/IoC-get-Bean-createBean-5/

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启动流程

https://www.modb.pro/db/87893

  1. 首先创建 一个SpringApplication对象,在创建的过程中对资源进行获取:判断该应用应该是什么类型;使用SpringFactoriesLoader查找并加载注册所有有用的ApplicationContextInitializer和ApplicationListener到Spring容器中;获取main 方法的对象类

  2. 然后由创建出来的对象SpringApplication执行run方法

  3. run方法的开始会启动一个时间监视器,统计项目启动所用的时间

  4. 初始化 ConfigurableApplicationContext上下文和Spring Boot 启动异常收集类集合

  5. 通过SpringFactoriesLoader从META-INF/Spring.factories中获取并实例化SpringApplicationRunListener类和调用他们的starting方法,用于通知他们“Spring Boot开始启动了” (SpringApplicationRunListener是只在Spring Boot 启动过程中接受不同时间点的事件的监听者,用于在Spring Boot 的run方法执行不同过程中监听执行不同的方法)

  6. 创建并配置Spring Boot的环境配置 (注意这里会重新执行一次run方法,如果是debug的时候,需要留意这次run 方法不同于第一次的run)

  7. 打印Banner

  8. 创建Spring ApplicationContent 上下文类

  9. 创建 SpringBootExceptionReporter类,用于存放启动的时候错误信息

  10. 遍历调用 SpringApplicationRunListener的 contextLoaded()通知 所有SpringApplicationRunListener,告诉它们ApringContext加载完成。并加载ConfigurableEnvironment 和Configuration类 到Springcontext上下文中

  11. 调用ApplicationContext的refresh()方法,进行自动配置模块的加载,启动Tomcat容器,加载并初始化数据源,kafka 等中间件组件,执行 @Scheduled 注解 等

  12. 计时器停止计时;通知 SpringApplicationRunListenerSpring Boot 的上下文刷新完成了

  13. 查找实现了ApplicationRunner或CommandLineRunner接口的类,并执行 它们的 run方法

  14. 最后再遍历执行 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

事务

  1. 原子性(Atomicity): 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;
  2. 一致性(Consistency): 执行事务后,数据库从一个正确的状态变化到另一个正确的状态;
  3. 隔离性(Isolation): 并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;
  4. 持久性(Durability): 一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。

事务隔离级别

  1. READ-UNCOMMITTED(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。

  2. READ-COMMITTED(读取已提交): 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。

  3. REPEATABLE-READ(可重复读): 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。

  4. 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所在的节点即可取出数据;在根据辅助索引查找时,则需要先取出主键的值,再走一遍主索引。 因此,在设计表的时候,不建议使用过长的字段作为主键,也不建议使用非单调的字段作为主键,这样会造成主索引频繁分裂。

from https://gitee.com/SnailClimb/JavaGuide/blob/master/docs/database/MySQL.md#myisam%E5%92%8Cinnodb%E5%8C%BA%E5%88%AB

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/

https://blog.abreaking.com/upload/2021/06/o0ib7hug3iijqocad3n4g172rg.jpg

逃逸分析

知乎.《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持有此偏向锁,锁不升级。

from :知乎.https://zhuanlan.zhihu.com/p/71156910

volatile

Java技术驿站.《【死磕Java并发】—–深入分析volatile的实现原理》http://topjava.cn/article/1391297782668726272

架构师

Dubbo

  • 服务暴露过程

田小波.《Dubbo 源码分析 -服务导出》:http://www.tianxiaobo.com/2018/10/31/Dubbo-%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90-%E6%9C%8D%E5%8A%A1%E5%AF%BC%E5%87%BA

  • 服务调用过程

田小波.《Dubbo 源码分析 - 服务调用过程》:https://www.tianxiaobo.com/2019/01/09/Dubbo-%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90-%E6%9C%8D%E5%8A%A1%E8%B0%83%E7%94%A8%E8%BF%87%E7%A8%8B/

分布式知识

极客时间.《想成为架构师,你必须知道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 芋道源码

https://blog.abreaking.com/upload/2021/02/5kcq5u2fj8gjmq36eudsblml1b.png

发表评论

最新评论

    来第一个评论吧!