自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(84)
  • 资源 (1)
  • 收藏
  • 关注

原创 彻底理解servlet匹配顺序 / 和 /*的区别

先看一下tomcat是怎么保存servlet的路径的。每个servlet在tomcat中是由一个wrapper表示的,由这个wrapper去进行servlet的加载,执行等操作。所以添加一个servlet到context中就是添加一个wrapper。tomcat根据servlet配置的映射路径把wrapper分成四类。name表示之后用于匹配的部分。以/*结束:Wildcard wrapper。 name是 / *之前的部分以*.开始:Extension wrapper 。 nam

2022-03-16 01:12:18 1036 2

原创 tomcat源码分析2 —— 启动过程

一般都是通过bat或者sh脚本启动的,这些脚本都是调用的Bootstrap类的main方法,所以先分析Bootstrap。脚本启动过程它的主要作用就是接收脚本的参数,然后创建一个Catalina对象,把操作传递给Catalina对象。// org/apache/catalina/startup/Bootstrap.javaprivate static Bootstrap daemon = null;private Object catalinaDaemon = null;protected Cl

2022-03-16 00:29:06 577

原创 tomcat源码分析1 —— 整体架构

tomcat的整体结构大概可以分成两块,一个是Connector,另一个是Container。Connector负责接收请求,建立socket连接,根据请求中的信息创建Request和Response对象,具体的处理逻辑交给Container。server.xml配置文件描述了tomcat服务器的整体结构。Server:表示整个Tomcat服务器,包含一个或多个Service。Service:包含一个或多个connector + 一个Engine。Engine:包含一个或多个Host。Host:

2022-03-16 00:06:25 1253

原创 tomcat8 文件上传大小限制

maxPostSize网上很多提到的Connector中的参数maxPostSize,在当前版本中,它不限制文件大小。它的两个主要作用:限制content-type为application/x-www-form-urlencoded的post 请求体的大小。限制content-type为multipart/form-data时,请求体中所有非文件部分总和的大小。默认2M。设成-1表示无限制。文档中该字段的含义The maximum size in bytes of the POST which

2022-03-15 15:39:19 4944

原创 ReentrantLock重复唤醒,park失效的问题

当使用lockInterruptibly的时候,如果人为中断线程,排在这个线程之后的线程可能会被unpark两次。这样在业务代码中就会出现park不住的情况。问题描述按以下步骤执行:A线程lockB线程lockInterruptiblyC线程lock到现在为止A获得锁,B线程是等待队列头节点后的下一个节点,C在B之后。interrupt B线程,在cancelAcquire中的unparkSuccessor打断点。A线程unlock,在unparkSuccessor打断点。然后让B线程和

2020-11-29 16:48:38 607 1

原创 【JUC源码】ThreadPoolExcutor中非成对的锁

ThreadPoolExcutor中的runWorker中最开始有一个w.unlock(),然而前面并没有w.lock()。注释中写的是允许打断,这是什么意思?final void runWorker(Worker w) { Thread wt = Thread.currentThread(); Runnable task = w.firstTask; w.firstTask = null; // 这是什么东西??? w.unlock(); // allow int

2020-11-28 21:53:12 175

原创 转自JEP的@sun.misc.contended行为说明

JEP-142: Reduce Cache Contention on Specified Fields用在类上类的代码 @Contended public static class ContendedTest2 { private Object plainField1; private Object plainField2; private Object plainField3; private Object plainField4; }对象的大小

2020-09-29 20:25:49 179

原创 深入理解RequestMappingHandlerMapping设计思想

简介本文从类的设计角度分析SpringMVC从RequestMappingHandlerMapping获取handler的整体流程,分析了RequestMappingHandlerMapping及其父类之间的关系。getHandler干了什么getHandler主要干下面三件事情:根据request找到handler根据request找到handlerInterceptor把handler和handlerInterceptor一起放到一个HandlerExecutionChain里面,返回这个

2020-09-15 15:46:52 733

原创 ConcurrentHashMap1.8的一个bug!

第二遍看ConcurrentHashMap的过程中注意到了一个细节。几乎把网上的博客都找遍了也没找到合理的解释,最后发现是一个bug。。。。。private final void addCount(long x, int check) { //... if (check >= 0) { Node<K,V>[] tab, nt; int n, sc; while (s >= (long)(sc = sizeCtl) &a

2020-08-02 15:26:32 267 1

原创 【JUC源码】线程池ThreadPoolExecutor

线程池整体结构线程池就是很多线程加一个存储任务的阻塞队列,这些线程会不停的从阻塞队列中拿任务,然后执行。一般线程池会有一些参数:核心线程数:核心线程默认是不会结束了,一直会等待新的任务到来最大线程数:当核心线程都在处理任务,阻塞队列也满了,那就会创建一些救急线程。救急线程数+核心线程数就是最大线程数。下图就描述了往线程池中提交一个任务的整体流程。注意线程池里面刚开始是没有线程的。ThreadPoolExecutor接下来看看ThreadPoolExecutor从submit开始的整体

2020-08-01 14:29:52 175

原创 【JUC源码】图解LongAdder

简介本文介绍了LongAdder的的整体流程。LongAdder和AtomicLong的区别通俗地讲,AtomicLong对象用 一个 long类型的内部变量存储值,多个线程得交替执行累加操作。LongAdder用 多个 long类型的内部变量存储值,多个线程可以一起执行累加操作。下图中一个箭头就代表一个线程。怎么实现的呢?因为现在除了一个base,还有好多个cell,每个cell里面存的都是一个long类型的值。那很多线程一起来的时候,就让不同的线程加到不同的cell里面去就好了,最后想要获

2020-07-31 19:15:06 283

原创 批量重偏向和批量撤销理解

简介本文记录一下自己看b站juc视频的一点疑惑。视频地址重偏向的时候,撤销次数会增加吗? 不会一个被重偏向完的对象,还能被第二次重偏向吗? 不能不清楚的朋友可以往下看一看,应该能有所收获。实验代码package cn.itcast.test;import lombok.extern.slf4j.Slf4j;import org.openjdk.jol.info.ClassLayout;import java.util.Vector;import java.util.concurre

2020-07-30 21:21:36 2229 7

原创 【JUC源码】FutureTask详解

简介本文主要分析FutureTask的实现原理,以运行过程中state的变化为切入点,最终把整个过程归纳为三张流程图。FutureTask的整体结构private volatile int state; // 标记当前运行状态private Callable<V> callable; // 实际运行的代码private Object outcome; // callable运行结果private volatile Thread runner; // 运行callable的线程

2020-07-29 16:58:57 274

原创 【spring源码】注解版bean加载流程

1. 简介本文以SpringBoot的自动配置过程为例,粗略地分析了注解版beanDefinition的加载流程和创建bean的流程。2. springboot自动配置spring配置版的配置类是显示的传入的,如下所示。ApplicationContext ac = new AnnotationConfigApplicationContext(Config.class);而springboot的启动代码就这么一行,那配置信息到底是怎么传入的?@SpringBootApplicationpub

2020-07-17 22:12:18 651

原创 【springboot源码】真正理解配置文件加载顺序

1. 简介本文将从源码的角度解析配置文件的加载流程,请带着以下几个问题去阅读:命令行,虚拟机,配置文件配置的spring.profiles.active原理是什么?配置文件的目录和配置文件的名字是谁规定的?不同配置文件的优先级是怎么实现的?多个配置文件加载顺序是什么?2. spring.profiles.active本文的重点是配置文件的加载顺序,但这和spring.profiles.active是分不开的,所以先对spring.profiles.active作简要的介绍。2.1 设置方

2020-07-16 18:07:31 1121 3

原创 【spring源码】详解事务的全过程

1. 简介事务大致可以归纳为两个问题:事务的执行原理是什么?事务是依赖AOP实现的,AOP说简单点就是在执行原始方法之前先执行一些interceptor。那怎么引入事务呢?很简单,只需要干一件事情:在AOP的众多interceptor里面加入TransactionInterceptor,剩下的工作都是AOP做的。怎么引入TransactionInterceptor?当然是通过解析xml配置了,解析xml就是一个注册BeanDefinition的过程。在解析各种<tx:开头的标签时,就会根据

2020-07-08 17:02:59 255

原创 【spring源码】 全面简析AOP 注册 代理 执行

1. 简介AOP说简单点就是通过代理对代码进行一个封装,那要理解AOP就是要解决下面三个问题:在IOC的创建bean的流程中,在哪里执行了代理操作?配置在xml中的< aop:config >, < aop:aspectj-autoproxy/ > 等aop标签是怎么被解析的?执行原始方法的过程中,怎么触发@before之类的advice方法。围绕上述三个问题,我们从注册,代理,执行三方面来看看AOP到底是怎么实现的。2. 几个概念spring aop 中有很多概念

2020-07-07 18:47:33 268

原创 【spring源码】实例化详解 工厂方法 构造函数

createBeanInstance 是Spring实例化的核心代码,它根据不同的情况会调用四种实例化方法。本文分析比较复杂的instantiateUsingFactoryMethod和autowireConstructor,其它两种比较简单。instantiateUsingFactoryMethod通过工厂方法进行实例化,简单地想一下,肯定需要下面三个东西:工厂方法的bean,如果是静态工厂方法的话就不需要这个了。要调用的工厂方法需要传入的参数有了上述概念后,来看代码,代码很长很复杂,但

2020-07-03 13:02:04 360 1

原创 SpringBoot 2.x Redis 缓存过期时间 序列化

具体的原理可以看:RedisCacheManager 2.x 源码解析基于SpringBoot提供RedisCacheConfiguration改的,基本跟原始的一样。这样在yaml中可以进行默认配置。@Configuration@EnableConfigurationProperties(CacheProperties.class)@AutoConfigureAfter({RedisAutoConfiguration.class})class RedisCacheConfiguration {

2020-06-23 16:19:29 294

原创 RedisCacheManager 2.x 源码解析

2.X RedisCacheManager中没有RedisTemplate了,看起来更加复杂了,我们先弄清楚各个成员变量的含义,这样后面看源码的过程就会明了一些。1. RedisCacheManager里面的各个对象在2-5中详细解释。public class RedisCacheManager extends AbstractTransactionSupportingCacheManager { // cacheWriter,实际对Redis进行读写,键值都是byte[]。 private fi

2020-06-23 15:50:46 440

原创 分组验证 Validation group

参考英文原文连接Spring MVC 3.1开始引入了分组验证。接下来一步步演示如何进行分组验证,分为用spring和不用spring两部分。创建分组就是建几个接口public class Account implements PasswordAware { interface ValidationStepOne { // validation group marker interface } interface ValidationStepTwo {

2020-06-10 16:47:42 5167

原创 从源码理解SpringBoot异常处理流程

异常发生的地方下面是doDispatch代码,mvc的核心流程,一般出错在第一行代码,它调用了Controller里面的业务代码。出错的话就会把异常赋值给dispatchException。最后一行代码负责处理异常和渲染视图。 mv = ha.handle(processedRequest, response, mappedHandler.getHandler()); .....}catch (Exception ex) { dispatchException = ex;}......}

2020-05-23 00:02:47 248

原创 内部类加protected的问题

出错代码package org.example;public class A { protected static class Inner{ static public int n = 2; }}package org.example.nono;import org.example.A;public class B extends A { public voi...

2020-04-27 19:51:55 599 5

原创 【spring入门】 事务 传播详解

Spring配置采用的是注解配置。applicationContext.xml<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-i...

2020-03-31 23:15:41 177

原创 【spring入门】 AOP总结 多切面执行顺序

AOP一些知识点的总结,适合复习时候看,不适合刚学的时候看。两种不同的底层实现有接口:JDK的动态代理,获取bean要用接口类型。public interface Personpublic class Jack implements PersonPerson p = context.getBean(Person.class);System.out.println(p.getClass(...

2020-03-30 20:59:01 361

原创 【spring入门】 IOC基本知识点总结

pojo类package pojo;public class Product { private int id; private String name; private Category category; public int getId() { return id; } public void setId(int id) { this.id = ...

2020-03-28 21:43:37 248

原创 IDEA2019 配置Artifacts

网上说的流程:菜单-> File -> Project Structure -> Artifacts -> 加号 -> Web Application Exploded -> from Module但是。。我的Web Application Exploded后面什么都没有啊。。。解决方法...

2020-03-16 20:49:54 1563

原创 蓝桥杯 填字母游戏

博弈论关键要记忆化,不然会超时,就只有20分。#include<bits/stdc++.h>using namespace std;string s;int n;map<string, int> mp;int islol(){ //返回当前状态下我先下第一步得到的最好情况 if(mp.count(s)) return mp[s]; //记忆化,不然会超时...

2020-02-08 15:31:03 186

原创 蓝桥杯 分考场 vector引用的坑

这题本身不难,但是因为刚开始想偷懒,卡在vector引用导致的问题上很久很久。。。这里的n到100了,不能用动态规划做着色的方法做了,用dfs可以做。从第一个人开始一个个人考虑,要么自己单独开一个考场,要不加入已有的考场(如果能加进去的话)。#include<bits/stdc++.h>using namespace std;int n, m;int a[105][105]...

2020-02-06 20:36:33 297

原创 蓝桥杯 第十届 研究生组 C/C++ 试题J: 空间跳跃 题解

网上找不到题解。。也不知道是不是对的,反正给的四个测试用例是通过了。先找到所有可能的通路,然后从通路上的每个点往外走一步,当走到第一个不在这些通路上的点时,立即重启游戏。这样就能最小化现实时间了。计算公式Ans = sum{可行路径的概率* 走到终点的花费} + sum{走到重启点的概率 * (对应的花费+Ans)}如果每个都只有一条路能到达:先用dfs找到所有可行路上的点,记录下走到...

2020-02-01 13:47:22 1620

原创 拓扑排序

dfs实现int c[maxn];int topo[maxn],t;bool dfs(int u){ c[u] = -1; for(int v=0;v<n;v++) if(G[u][v]){ if(c[v]<0) return false; //存在有向环 else if(!c[v] && !dfs(0)) return false; } c[u]...

2020-01-17 15:18:16 80

原创 欧拉回路 欧拉路径 Hierholzer’s Algorithm

欧拉路径:从一个点出发,每条边都只走一遍,结束于另一个点。欧拉回路:起点和终点是同一个点。大前提:基图(去掉方向后的图)中所有度不为0的点属于一个连通分量。欧拉路径:无向图中,只有两个点的度为奇数,这两个点分别为起点和终点。有向图中,只有一个点的出度比入度大1,这个点当起点,只有一个点的入度比出度大1,这个点当终点。欧拉回路:无向图中,每个点的度为偶数。有向图中,每个点的入度等于出度。欧...

2020-01-17 11:07:31 995

原创 RMQ hdu3183 RMQ模板

基础RMQ模板dp[i][j]代表从i开始并且包括i的2^j个数字中最小(最大)的值。构建的过程可以用动态规划完成dp[i][j]=min(dp[i][j-1],dp[i+(1<<j-1)][j-1])void rmq_init(){ for(int i=1;i<=N;i++) dp[i][0]=arr[i]; for(int j=1;(1<&lt...

2020-01-06 21:24:41 90

原创 莫队

P4137 Rmq Problem / mex大佬解释#include<iostream>#include<cstdio>#include<cmath>#include<algorithm>using namespace std;const int maxn = 200005;int n, m, ans, curl(1), curr,...

2020-01-06 17:00:13 69

原创 树状数组 模板

P3374 【模板】树状数组 1#include<iostream>#include<cstdio>using namespace std;int a[100005], n, m;inline int lowbit(int x) { return x & (-x);}void add(int x, int s) { while (x <= n...

2020-01-06 14:19:42 63

原创 编译原理 词法分析 RE NFA DFA MDFA

所有的算法实现:https://github.com/SZFHH/compiler效果以下所有的图片来自网易云课堂 华保健老师的编译原理RE->NFA Thompson算法具体实现中先把正则表达式变成了一棵正则树,这部分是由递归下降算法完成的。然后再由正则树转换成NFA。NFA->DFA 子集构造算法DFA中的每个点包含了NFA中的n个点,这n个点组成一个set。从...

2019-12-13 14:12:14 887

原创 编译原理 语法分析 LL(1) LR(0) SLR LR(1) LALR

本文的图片来自网易云课堂华保健老师的编译原理这五种文法都是自动生成的,基于表驱动的语法分析方法。可以分为两类:LL(1)和其余四种。前者是自顶向下的,从最初的S推导出整个句子。后者是自底向上的,从句子规约为S。(S为代表整个句子的非终止符。)LL(1)构造LL(1)表的过程中涉及的概念:FIRST集:从非终结符N开始推导得出的句子开头的所有可能终结符集合。FIRST_S(X Y Z):...

2019-12-13 13:14:48 2271

原创 99. 恢复二叉搜索树

Morris遍历中序遍历可以理解为从根节点先往左边走,走到最左边,然后往上走,再往右。同一个结点第二次经过的时候,输出这个结点的值。Morris利用叶结点left和right的NULL实现了上述过程,通过right记录下一个要走的结点。记cur为当前走到的结点,如果是第一次走到,那么让cur的左子树的最右结点的right指向cur,否则就把cur的左子树的最右结点的right重新置为NUL...

2019-12-01 12:54:00 68

原创 84. 柱状图中最大的矩形

每个柱子可以伸展最远的距离为左边第一个低于它的柱子和右边第一个低于它的柱子,所以如果能记录每个柱子上述两个值,就可以解决问题了。建立堆栈s,s压入-1从左往右遍历heights数组,记索引未i。1.如果s中只有-1,或者heights[i]>=heights[s.top()],压入i。2.否则,弹出s栈顶的下标k,以heights[k]为高度的矩形最大为heights[k] * ...

2019-12-01 12:27:23 67

原创 76. 最小覆盖子串

记L,R为当前检查子串的最左端和最右端。1.刚开始让L和R为0。2.然后R一直往右,直到找到第一个满足要求的子串。记录此时的子串长度。3.让L往右,直到子串第一次不满足要求,记录这个过程中最短的满足要求的子串长度。4.此时的子串是不满足要求的,重复第2,3步骤。class Solution {public: string minWindow(string s, string t...

2019-12-01 12:01:42 99

吴恩达老师卷积神经网络yolo.h5

吴恩达老师卷积神经网络yolo.h5。做作业的时候发现从coursera上下的yolo.h5 无法导入。

2018-12-31

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除