Spring的getBean方法阅读
😀 这里写文章的前言:一个简单的开头,简述这篇文章讨论的问题、目标、人物、背景是什么?并简述你给出的答案。
可以说说你的故事:阻碍、努力、结果成果,意外与转折。
📝 方法@Override public <T> T getBean(String name, Class<T> requiredType) throws BeansException { return doGetBean(name, requiredType, null, false); }
@Override public Object getBean(String name, Object... args) throws BeansException { return doGetBean(name, null, args, false); }
可以看到最后是走到了 doGetBean 这个方法里面来的. 这么看下来,doGetBean这个方法的代码还是蛮多的,其中有createBean()方法,这个方法从名字上看,就是创建bean的. ...
Spring源码阅读
😀 这里写文章的前言:Spring源码流程阅读
📝 阅读方式
创建一个 Maven项目,引入Spring相关的依赖, 然后写一个启动类,在类上打上debug一层一层的走进去,就可以看到源码是怎么走的,怎么加载的
从github上git Spring到自己本来,然后安装gradle,build 一下项目就可以了,这是基于Spring源码去跑的,可以直接在代码里面打印对应的输出语句,对于代码的走向是更加熟悉的
目前比较流行的是SpringBoot,也可以直接启动一个SpringBoot项目,然后在run方法上打上断点,跟着源码一步一步的走,最后每个方法都走一遍会很有效的理解
源码阅读这里我们写一个读取从包位置扫描的类. 其实这个注解,你也可以加入到你启动类上面去扫描,效果也是一样的.这样的话,YangConfig就会当作为一个bean。如果你写在你的启动类上的话,那么你的启动类就会当作为一个bean
package com.yang.config;import org.springframework.context.annotation.ComponentScan;/** * @ ...
MyBatis源码阅读搭建
😀 这里写文章的前言:一个简单的开头,简述这篇文章讨论的问题、目标、人物、背景是什么?并简述你给出的答案。
可以说说你的故事:阻碍、努力、结果成果,意外与转折。
📝 MyBatis 作为一名 “优秀的” CRUD 工程师,如果不看MyBatis是个怎么大概的执行流程的话,那还真是有点可惜. 所以阅读一下其源码和执行流程,是很有帮助的. 同时,看下其代码(设计模式等对成长也是很有帮助的).
代码github 源码地址:https://github.com/mybatis/mybatis-3
官网文档地址: https://mybatis.org/mybatis-3/zh/configuration.html#properties
先将github上的代码clone下来,导入到本地的idea中. 然后按照官方文档的demo搭建就可以了. 这里自行创建一个 resources 目录即可,也就是放置一些配置文件信息的
实体类public class Phone { private Integer id; private String phone; public P ...
MySql BufferPool
😀 这里写文章的前言:一个简单的开头,简述这篇文章讨论的问题、目标、人物、背景是什么?并简述你给出的答案。
可以说说你的故事:阻碍、努力、结果成果,意外与转折。
📝 Innodb 体系图
Buffer PoolInnodb为了缓存磁盘的页,在mysql服务器启动向操作系统申请了一片连续的内存,该内存叫 Buffer pool(缓冲池)。默认情况下 128M 大小
查看大小指令
show variables like 'innodb_buffer_pool_size';
读取数据时,先从缓冲池中查看是否数据的页(page)存在,不存在的话去磁盘上检索,查到后缓存到innodb_buffer_pool中,同理,插入修改删除操作也是先操作缓存里数据,之后再以一定的频率更新到磁盘上,这个刷盘的机制叫checkpoint
Innodb引擎设计一个缓冲池(Buffer Pool),来提高数据库的读写性能 有Buffer Pool后:
当读取数据时,如果数据存于 Buffer Pool中,客户端就会直接读取 Buffer Pool中的数据,否则再去磁盘中读取
当 ...
MySql日志
😀 这里写文章的前言:一个简单的开头,简述这篇文章讨论的问题、目标、人物、背景是什么?并简述你给出的答案。
可以说说你的故事:阻碍、努力、结果成果,意外与转折。
📝 MySql日志分为 undo log(回滚日志), redo log(重做日志),binlog(归档日志)
undo log(回滚日志):innodb存储引擎层生成的日志,实现了事务中的原子性,主要用于事务回滚和MVCC
redo log(重做日志):innodb存储引擎层生成的日志,实现了事务中的持久性,主要用于掉电等故障恢复
binlog(归档日志):是Server层生成的日志,主要用于数据备份和主从复制
undo log每次执行事务的过程中,都记录下回滚时需要的信息到一个日志里,那么在事务执行中发生了MYSQL崩溃后,就不用担心无法回滚到事务之前的数据,我们可以通过这个日志回滚到事务之前的数据 undo log 这个机制,它保证了事务的ACID中的原子性 每当innodb引擎对一条记录进行操作(增加,修改,删除)时,需要把回滚时需要的信息都记录到undo log里:
在插入一条记录时,把这条记录的主 ...
线程池源码笔记
😀 这里写文章的前言:一个简单的开头,简述这篇文章讨论的问题、目标、人物、背景是什么?并简述你给出的答案。
可以说说你的故事:阻碍、努力、结果成果,意外与转折。
📝 线程池使用线程池的好处核心问题就是资源管理问题
频繁申请/销毁资源和调度资源,将带来额外的消耗,可能会非常巨大
对资源无限申请缺少抑制手段,容易引发系统资源耗尽的风险
系统无法合理管理内部的资源分布,会降低系统的稳定性
注意: 在 hotspot模型下,java的线程会一对一的映射内核线程,意味着每次申请和销毁都要转换到内核去操作,内核转换这个操作是十分消耗性能的,可能这个线程的时间还没 消耗+申请 加起来久
线程池的优势
提供资源的利用性: 通过池化可以重复利用已创建的线程,空闲线程可以处理新提交的任务,从而降低了创建和销毁的资源开销
提高线程的管理性: 在一个线程中管理执行任务的线程,对线程可以进行统一的创建,销毁以及监控等,对线程数做控制,防止线程无限制创建,避免线程数量的急剧上升而导致CPU过度等问题
提高程序的响应性:提交任务后,有空闲线程可以直接去执行任务,无需新建
提高系统的可扩展 ...
ReentrantLock源码笔记
😀 这里写文章的前言:一个简单的开头,简述这篇文章讨论的问题、目标、人物、背景是什么?并简述你给出的答案。
可以说说你的故事:阻碍、努力、结果成果,意外与转折。
📝 ReentrantLock源码笔记介绍ReetrantLock 效果是和 synchronized 是一样的,只不过 synchronized 是内置锁,ReetrantLock是语法级别的锁, 相对于而言是比synchronized灵活性高些. 不过从我目前公司写代码角度来看,都是直接使用 synchronized . 但是不妨碍我们来看 ReetrantLock 里面的代码实现
使用代码 : 有lock方法就一定要有 unlock方法来释放锁. 一般代码中这样写即可.
public class ReentrantLockCaseMain { private ReentrantLock lock = new ReentrantLock(); public void lockUseCase(){ lock.lock(); try { ...
ThreadLocal源码阅读
😀 这里写文章的前言:一个简单的开头,简述这篇文章讨论的问题、目标、人物、背景是什么?并简述你给出的答案。
可以说说你的故事:阻碍、努力、结果成果,意外与转折。
📝 ThreadLocal源码阅读ThreadLocal 是来这个公司有过使用一次的感受,所以就学习阅读下源码。 其实Thread 这个里面,就有一个 Map(这里是用ThreadLocal内部类中实现的) , 里面的key就是 ThreadLocal, value 就是存储的值,所以一个Thread是有多个 ThreadLocal
参数private final int threadLocalHashCode = nextHashCode();/** * The next hash code to be given out. Updated atomically. Starts at * zero. AtomicInteger 是一个线程安全的,实现原理是采用了cas. */private static AtomicInteger nextHashCode = new AtomicInteger(); ...
volatile笔记
😀 这里写文章的前言:一个简单的开头,简述这篇文章讨论的问题、目标、人物、背景是什么?并简述你给出的答案。
可以说说你的故事:阻碍、努力、结果成果,意外与转折。
📝 volatile笔记前置条件
所有的数据处理都在CPU内进行,因此保存在内存中的程序在执行前需要被复制到cpu中。程序指令复制到CPU中,可以一次复制一条,也可以一次复制多条。CPU和物理内存之间的通信,CPU的处理速度远大于物理内存,所有CPU就了自己的内存,所以此时 CPU和主内存是不一致的
缓存一致性操作系统提供操作系统提供总线锁定的机制,前端总线(也叫CPU总线,Front Side Bus))是所有CPU与芯片组连接的主干道,负责CPU与外界所有部件的通信,包括高速缓存、内存、北桥,其控制总线向各个部件发送控制信号、通过地址总线发送地址信号指定其要访问的部件、通过数据总线双向传输。在CPU1要做 i++操作的时候,其在总线上发出一个LOCK#信号,其他处理器就不能操作缓存了该共享变量内存地址的缓存,也就是阻塞了其他CPU,使该处理器可以独享此共享内存。 但我们只需要对此共享变量的操作是原子就可以了,而 ...
synchronized笔记
😀 这里写文章的前言:一个简单的开头,简述这篇文章讨论的问题、目标、人物、背景是什么?并简述你给出的答案。
可以说说你的故事:阻碍、努力、结果成果,意外与转折。
📝 synchronized前置条件临界区
一个程序运行多线程本身没有问题
多个线程访问共享资源
多个线程访问共享资源也没问题
多个线程对共享资源读写操作时发生指令交错,就会出现问题
一段代码块内如果存在对共享资源的多线程读写操作,称这段代码块为临界区,其共享资源为临界资源
竞态条件多个线程在临界区内执行,由于代码顺序序列不同而导致结果无法预测,称之为发生了竟态条件
阻塞解决方法: Synchronized,Lock
非阻塞解决方法: 原子变量
synchronizedsynchronized 同步快是 java 提供的一种原子性内置锁,java中的对个对象都可以当作一个同步锁来使用,这些java内置的使用者看不到等锁被称为内置锁,也叫做监视器 基于 Monitor机制实现,依赖底层操作系统的互斥原语Mutex(互斥量), 它是一个重量级锁,性能较低。 1.5之后进行了优化,锁粗化,锁消除,轻量级锁, ...







