Java 线程池源码分析
Java 线程池源码线程池的执行流程
主线程调用execute、或者submit等方法提交任务给线程池执行
如果线程池中正在运行的工作线程数量小于corePoolSize,线程池会创建线程去运行这个任务
如果线程池中正在运行的工作线程数量大于或等于 corePoolSize(核心线程数量),那么将这个任务放入队列,等待线程从队列中获取任务
如果这时队列满了且正在运行的工作线程数量还小于 maximumPoolSize,那么会创建非核心线程立刻运行这个任务,这部分非核心工作线程空闲超过一定的时间(keepAliveTime)时,就会被销毁回收(线程退出了)
如果最终提交的任务超过了maximumPoolSize(最大线程数量),线程池就会执行拒绝策略
线程池创建参数线程池的构造函数
1234567891011121314151617181920212223public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, lo ...
Spring aop 源码分析 (3)
Spring aop 源码分析 (3)前置知识在阅读此文章前, 建议先阅读一下
Spring aop 源码分析 (2)
正在努力的赶来~~
Spring transaction 分析
Spring 事务分析前置知识在阅读此文章前, 了解一下基础知识有助于阅读
事务的概念
事务的隔离级别
JDBC基础
Spring bean 的生命周期
创建代理对象有了解过spring bean生命周期知道, 代理对象的创建一般在实在初始化后, 在BeanPostProcessor类中的applyBeanPostProcessorsAfterInitialization方法实现的
在AbstractAutoProxyCreator中的applyBeanPostProcessorsAfterInitialization中, 会调用wrapIfNecessary, 在wrapIfNecessary方法中, spring通过getAdvicesAndAdvisorsForBean方法获取了作用于当前bean的specificInterceptors(例如: BeanFactoryTransactionAttributeSourceAdvisor) ,然后将该specificInterceptors放入到proxyFactory中, 通过proxyFactory去创建代理对象
方 ...
Spring aop 源码分析 (2)
Spring aop 源码分析 (2)前置知识在阅读此文章前, 建议先阅读一下
Spring aop 源码分析 (1)
创建代理对象在上一篇文章中说道, AopProxyFactory通过一些条件判断创建的AopProxy是基于cglib的CglibAopProxy还是基于jdk的JdkDynamicAopProxy. 接下来我们就看看AopProxy到底是如何产生代理对象的, 并且代理过程是如何执行的
CglibAopProxy我们首先看一下getProxy方法
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263@Overridepublic Object getProxy(@Nullable ClassLoader classLoader) { ... try { Class<?> rootClass = this.advised.get ...
Spring mvc 分析
Spring mvc分析前置知识在阅读此文章前, 了解一下基础知识有助于阅读
Spring bean 的生命周期
ApplicationContext 的创建流程
Servlet 相关知识
Tomcat 的简单配置和使用
环境搭建添加依赖
spring mvc
tomcat-embed-core
配置类12345@EnableWebMvc@ComponentScan@Configurationpublic class Config {}
启动类12345678910111213141516171819202122232425262728public class TomcatServer { private static final int PORT = 8080; private static final String CONTEXT_PATH = "/web"; public static void main(String[] args) throws Exception { To ...
Spring 处理循环依赖
Spring 处理循环依赖前置知识在阅读此文章前, 了解一下基础知识有助于阅读
什么是循环依赖以及循环依赖出现的情况
spring bean的生命周期
解决循环依赖的核心思想
对象引用的提前暴露
先赋值, 再初始化
Spring不能解决循环依赖的场景
构造注入:
构造器注入时候, bean的创建有着严格的顺序, 这种顺序会使spring无法提前暴露引用
prototype模式Field属性注入循环依赖:
原型模式没有缓存, 每次注入都要创建新的对象, 会导致对象的循环创建, spring会检测到提前抛出BeanCurrentlyInCreationException
123456// in AbstractBeanFactory.doGetBean// Fail if we're already creating this bean instance:// We're assumably within a circular reference.if (isPrototypeCurrentlyInCreation(beanName)) { ...
Git 提高 (2)
Git 提高 (2)提交原则Do one thing and do it well
Git的每一个commit最好是解决一个问题或者是一个小的改动, 如果一个提交包含过多的改动, 会造成以下问题:
增加了代码评审的难度
缺乏原子化: 如果提交中仅有少部分有问题, 需要撤回整个提交
过多的提交导致提交说明难以描述清楚
提交描述规范Git提交描述由三部分构成
1<type>(<scope>): <subject>
type(必须)
用于说明git commit的类别,只允许使用下面的标识。
feat:新功能(feature)
fix/to:修复bug,可以是QA发现的BUG,也可以是研发自己发现的BUG
fix:产生diff并自动修复此问题。适合于一次提交直接修复问题
to:只产生diff不自动修复此问题。适合于多次提交。最终修复问题提交时使用fix
docs:文档(documentation)
style:格式(不影响代码运行的变动)
refactor:重构(即不是新增功能,也不是修改bug的代码变动)
perf:优化相关,比如提升 ...
Spring aop 源码分析 (1)
spring aop 源码分析前置知识
spring ioc 容器
spring bean 的生命周期
spring 中常见类的作用
spring aop 的基本使用
cglib 动态代理知识
jdk 动态代理知识
源码分析一切皆是 BeanPostProcessor了解过spring框架的同学都知道, spring中很多功能都是通过实现BeanPostProcessor接口,
在创建bean之后的初始化方法中, 有applyBeanPostProcessorsAfterInitialization方法
123456789101112protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) { // 代码省略 if (mbd == null || !mbd.isSynthetic()) { // after Initialization // bean初始化之后, 调用beanPostProc ...
Https抓包分析
抓包分析https数据包说明
192.168.123.1 为服务端
192.168.123.48 为客户端
抓包分析1. 三次握手建立通信https使用tcp/ip协议, 客户端和服务端进行通信前也需要经过基础的三次握手
2. 客户端发送Client Hello
该请求将客户端支持的所有SSL/TSL协议版本, 加密算法和一个Random随机数发送给服务端
3. 服务端Server Hello
服务端发送一个Server Hello请求, 表示自己从客户端的Client Hello信息中选择的加密算法, 并返回了自己生成的随机数
4. 服务端 Server Hello Done服务端发送Server Hello Done表示当前Hello过程结束, 该请求包含了服务端的SSL证书信息
5. 客户端Client Key ExchangeChange Cipher Spec: 客户端通知服务端后面再发送的消息都会使用前面协商出来的秘钥加密了,是一条事件消息
Encrypted Handshake Message: 这一步对应的是 Client Finish 消息,客 ...
Git 提高 (1)
Git提高add了不需要的文件在开发过程中, 有时候使用add ., 但是忘记配置.gitignore, 导致很多不必要的文件被添加到暂存区
这个时候我们就可以使用git rm命令删除文件
12345# 连同工作区和暂存区一起删除git rm fileName# 仅删除暂存区的文件git rm --cached fileName
演示
123456789101112131415161718192021root@MagicBookPro:~/git-learn# git add .# 发现所有文件不小心被添加到暂存区root@MagicBookPro:~/git-learn# git statusChanges to be committed: (use "git rm --cached <file>..." to unstage) new file: READEME.md new file: project.config# 从暂存区里面移除root@MagicBookPro:~/git-learn# git rm ...