- 博客(82)
- 收藏
- 关注
原创 【踩坑】Collectors.toMap 抛出 NullPointerException 异常
【代码】【踩坑】Collectors.toMap 抛出 NullPointerException 异常。
2024-12-04 17:32:33
380
原创 【MySQL】InnoDB记录结构
比方说使用 utf8 字符集的 CHAR(10) 类型的列占用的真实数据空间始终为 30 个字节,使用 gbk 字符集的 CHAR(10) 类型的列占用的真实数据空间始终为 20 个字节。在 Compact 和 Redundant 行格式中,对于占用存储空间非常大的列,在记录的真实数据处只会存储该列的一部分数据,把剩余的数据分散存储在几个其他的页中,然后记录的真实数据处用20个字节存储指向这些页的地址(当然这20个字节中还包括这些分散在其他页面中的数据的占用的字节数),从而可以找到剩余数据所在的页。
2024-12-04 15:32:06
815
原创 【MySQL】字符集与排序规则
一种字符集可能对应着若干种比较规则,不同的比较规则对于相同字符产生的结果可能不同,比如说在字符集为 utf8,比较规则为 utf8_general_ci 的情况下,A 和 a 是相等的,如果将比较规则改为 utf8_general_cs,则不相等。这个字符集也有一个别名。如果在创建和修改的语句中没有指明字符集和比较规则,将使用该列所在表的字符集和比较规则作为该列的字符集和比较规则。如果创建表的语句中没有指明字符集和比较规则,将使用该表所在数据库的字符集和比较规则作为该表的字符集和比较规则。
2024-11-22 14:43:47
1767
原创 多线程学习篇七:ReentrantLock
通过运行结果得出结论:main 线程在执行 m1 方法的时候获取到锁,在执行 m2、m3 方法时同样获取到了锁,所以 ReentrantLock 是可重入的。通过运行结果,得出结论: 每次 “插入线程” 都是最后执行。PS:如果不是期望结果,可以运行多次。
2024-11-01 10:03:22
647
原创 多线程学习篇六:park / unpark
通过运行结果得出结论:如果 t1 线程在执行 park 方法之前执行了多次 unpark 方法,第一次执行 park 方法不进入阻塞状态,再一次执行 park 方法将进入阻塞状态。通过运行结果得出结论:如果 t1 线程在执行 park 方法之前执行了 unpark 方法,park 方法不能让 t1 线程进入阻塞状态。通过运行结果得出结论:阻塞的线程在执行 unpark 方法后,恢复运行。main 线程睡眠时间大于 t1 线程睡眠时间。main 线程睡眠时间小于 t1 线程睡眠时间。
2024-10-29 16:37:50
587
原创 多线程学习篇五:wait / notify / notifyAll
wait():让进入 object 监视器的线程到 waitSet 等待notify():在 object 上正在 waitSet 等待的线程中挑一个唤醒notifyAll():让 object 上正在 waitSet 等待的线程全部唤醒它们都是线程之间进行协作的手段,都属于 Object 对象的方法。必须获得此对象的锁,才能调用这几个方法即 Guarded Suspension,用在一个线程等待另一个线程的执行结果。
2024-10-24 15:54:40
725
原创 从字节码分析方法传递引用类型和原始类型的区别
虽然变量 index 的引用对象指向 Integer(2),局部变量表的作用域只限于 m2 方法的栈帧,当栈帧出栈,在 main 方法的栈帧中 index 仍然指向 Integer(1),所以在 main 方法中 index 的值为 1。所以当方法结束,栈帧出栈,打印的是 main 方法栈帧对应的 index 的值(1)为什么在 m1、m2 方法内,index 的值为 2,在main 方法中的值为 1?
2024-10-17 11:00:35
351
原创 从字节码角度分析 synchronized 锁不住包装类的原因
当执行到 putstatic(序号为 31 的指令)的时候会引用新的对象,此时如果有新线程执行指令 monitorenter 也会加锁成功,这时候就会有两个线程对整型 i 进行操作,就会出现线程安全问题。通过运行结果得出结论: t1 线程拥有锁, t2 线程等待锁,对象都是同一个(0x000000076adfd5e8)默认情况下,如果整型的范围在-128 ~ 127 内,则复用缓存的包装对象,否则创建一个新的包装对象。针对上述的猜想,我们将 k 调整为100,这时候锁住的对象都是缓存的包装类。
2024-10-16 09:14:25
816
1
原创 多线程学习篇四:synchronized
重量级锁竞争的时候,还可以使用自旋(循环尝试获取重量级锁)来进行优化,如果当前线程自旋成功(即这时候持锁线程已经退出了同步块,释放了锁),这时当前线程就可以避免阻塞。轻量级锁的使用场景:如果一个对象虽然有多线程要加锁,但加锁的时间是错开的(也就是没有竞争),那么可以使用轻量级锁来优化。如果在尝试加轻量级锁的过程中,CAS 操作无法成功,这时一种情况就是有其它线程为此对象加上了轻量级锁(有竞争),这时需要进行锁膨胀,将轻量级锁变为重量级锁。加锁时 Mark Word 的最后三位是 000(0),即轻量锁。
2024-10-12 15:38:25
1126
原创 多线程学习篇三:共享带来的问题及解决方案
多个线程读共享资源其实也没有问题,在多个线程对共享资源读写操作时发生指令交错,就会出现问题。以上的结果可能是正数、负数、零。因为 Java 中对静态变量的自增、自减并不是原子操作,要彻底理解,必须从字节码来进行分析。两个线程对初始值为 0 的静态变量一个做自增,一个做自减,各做 5000 次,结果是 0 吗?多个线程在临界区内执行,由于代码的执行序列不同而导致结果无法预测,称之为发生了。一个程序运行多个线程本身是没有问题的,问题出在多个线程访问。为了避免临界区的竞态条件发生,有多种手段可以达到目的。
2024-09-18 15:21:05
554
原创 多线程学习篇二:Thread常见方法
Java 中线程状态有6个,分别为:NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING,TERMINATED。t1 是非守护线程, t2 是守护线程,当 t1 执行完 JVM 中不存在非守护线程,即使 t2 未执行完,也会退出 JVM。运行到 t1 的 join 方法时,t1 运行结束,t2 已运行 1s,所以还需要等到 1s 就可以运行完毕。运行结果:通过打印日志的时间戳,我们可以看出来,如果一个线程的打断标记为 true,则 park 失效。
2024-09-14 17:07:49
908
原创 多线程学习篇一:启动多线程的三种方式
入参为 Runable 的构造方法会将传入的 Runable 赋值给 Thread 的。属性是不是为 null,如果不为 null 则调用 target 方法。的组合形式有返回值,也可以指定等待时间,其它两种方式没有返回值。Thread 的 run 方法判断其。
2024-09-12 13:22:04
454
原创 SpringBoot配置动态数据源
1.2 数据库数据存在两个库 master、slave,每个库中都有一个 route 表,每个表中有一条数据,其中 sign 为库名用于获取、设置、移除数据源DynamicDataSource 继承自 AbstractRoutingDataSource,AbstractRoutingDataSource 的 getConnection 方法会通过调用 determineTargetDataSource 方法推断数据源2.4 创建配置类 DataSourceConfig2.4.
2024-08-26 10:27:57
2164
原创 Spring之@Bean注解
当注入的依赖存在多个候选者,如果候选者的 autowireCandidate 属性为 false,则不加入候选。指定 beanName ,未指定则为方法名。
2024-08-20 13:12:41
916
原创 Spring之@ComponentScan注解
2.1.2 创建配置类 AppConfig2.1.3 创建启动类 Main2.1.4 工程文件结构内置 14 个PS:其中有一个自定义的 bean(AppConfig),这里就当它是内置的2.2.2.2 运行 Main 方法,查看运行结果一共 15 个 beans = 内置(14) + p1(1)2.2.3.2 运行 Main 方法,查看运行结果一共 17 个 beans = 内置(14) + p1(1) + p2(1) + p3(1)beanName 生成器
2024-08-14 15:41:59
1197
原创 Spring之@Import注解
Import 注解 在 Spring 中占据重要地位,是 Spring 的一个重要扩展点。这篇博文我们以案例、源码、应用相结合,来系统的学习一下这个注解。
2024-08-13 14:23:47
1311
原创 SpringBoot 自定义 starter
starter 最令人津津乐道的就是其自动配置特性,我们自定义一个 starter,演示一下该功能。我的上一篇博文,分析了SpringBoot 的自动配置原理,有兴趣的小伙伴可以移步阅读。
2024-08-12 09:25:35
939
原创 SpringBoot 自动配置原理
默认情况下,待加载的自动配置类,满足相应 filters 的 (OnBeanCondition、OnClassCondition、OnWebApplicationCondition)match 方法就可以被加载。如果 2.2.2.2.4 配置的相关 Class 存在,且 2.2.2.2.2 (getCandidateConfigurations)获取的自动配置类不存在,则抛出异常。DeferredImportSelector 的处理滞后于普通配置类 (一般会依赖普通配置类的解析结果,所以解析时机靠后 )
2024-08-12 09:23:27
967
原创 SpringBoot 集成原生 Servlet、Filter、Listener
,当我们配置了原生的 servlet ,web 容器中就存在两个 Servlet,web 容器根据最佳匹配原则,映射到指定的 Servlet 上。继承 RegistrationBean ,RegistrationBean 的 getOrder 方法返回值是。通过响应我们可以知道,选择的是 DispatcherServlet(返回的是一个字符串)通过响应我们可以知道,选择的是 MyServlet(返回的是一个 html),对于同样继承 RegistrationBean 的。将方式1类上的相关注解(
2024-08-05 14:33:28
933
原创 SpringBoot集成Tomcat、DispatcherServlet
AbstractApplicationContext 的 refresh 方法是一个空壳方法,我们主要看它的实现类 ServletWebServerApplicationContext。
2024-07-24 13:08:50
1648
1
原创 我的创作纪念日(2周年)
曾经听到这样一段话,学习是一个输入和输出的过程,自己很认可这段话,但是一直没有付诸行动,直到两年前尝试写了第一篇博文,写的不太好,也没有多少阅读量,感觉花的时间和收获不成正比,就又放弃了。我是个很懒的人,一些知识点觉得自己应该会了,但是写博客我觉得应该抱着谨慎的态度,然后就会硬着头皮自己先写一些demo,在写demo的过程中加深了我的印象,也能发现一些细节问题。
2024-07-24 11:42:28
176
原创 SpringBoot之全局异常处理
会定义两个bean,其中一个 beanName 为 error,类型为 View,另一个 beanName 为 beanNameViewResolver,类型为 BeanNameViewResolver。PS:错误码需要和 html 名字一致,或者将 html 改成 4xx、5xx,这样以 4 开头的错误码就会跳转到 4xx.html,以 5 开头的错误码就会跳转到 5xx.html。根据一定的规则,在 Postman 中默认转发到 error 方法,在浏览器中默认转发到 errorHtml 方法。
2024-07-18 16:10:00
1297
原创 SpringBoot之拦截器(Interceptor)
在使用 SpringBoot 进行 javaEE 的开发过程中,如果希望添加拦截器,一般会实现 HandlerInterceptor 接口,然后通过 SpringBoot 的机制,将拦截器作用于指定方法上@Overridethrow new RuntimeException("自定义异常");
2024-07-18 13:42:41
1338
原创 @RequestPart 与 @RequestBody、@RequestParam 注解的异同点
RequestPart 注解是我们在JavaEE 开发中,比较常见的一个注解。它经常会与 @RequestBody 、@RequestParam 注解进行比较,这篇博文我们以案例和源码相结合,分析这几个注解的异同点。
2024-07-10 13:55:37
1993
原创 @RequestBody注解的使用及源码解析
RequestBody 注解是我们进行JavaEE开发,最常见的几个注解之一,这篇博文我们以案例和源码相结合,帮助大家更好的了解 @RequestBody 注解@Data@Override'}';
2024-07-10 10:16:44
1602
原创 @RequestMapping属性详解及案例演示
请求路径如果类和方法上都存在 @RequestMapping 注解,请求路径类上配置的path方法上配置的path。
2024-07-02 14:41:57
1047
原创 SpringBoot之内容协商
默认情况下,只有,因为我们在现象演示的时候,将属性设置为 true,所以多出来一个。如果 ParameterContentNegotiationStrategy 的 resolveMediaTypes 方法的返回值不为 null 且不为。
2024-07-02 13:09:46
1355
原创 @PathVariable注解的使用及源码解析
PathVariable 注解是我们进行JavaEE开发,最常见的几个注解之一,这篇博文我们以案例和源码相结合,帮助大家更好的了解@PathVariable 注解。
2024-06-27 10:34:53
2292
原创 @RequestParam注解的使用及源码解析
RequestParam 注解是我们进行JavaEE开发,最常见的几个注解之一,这篇博文我们以案例和源码相结合,帮助大家更好的了解@RequestParam 注解。
2024-06-27 10:21:33
7619
原创 SpringBoot之HiddenHttpMethodFilter
默认情况下,表单只能发送GET、POST请求,如果需要发送PUT、DELETE请求呢?SpringBoot通过解决了这一问题。URI 和具体方法的映射关系,都存储在这个属性中SpringBoot之请求映射原理如果存在自定义的 HiddenHttpMethodFilter,则默认的 HiddenHttpMethodFilter 失效。
2024-06-12 09:59:28
1285
原创 SpringBoot之请求映射原理
我们发出的请求,SpringMVC是如何精准定位到那个Controller以及具体方法?其实这都是 HandlerMapping 发挥的作用,这篇博文我们以 RequestMappingHandlerMapping 为例并结合源码一步步进行分析。默认 HandlerMapping 主要定义在和其祖父类中获取所有类型是 Object 的 beans,并且 beanName 不以开头根据 beanName 获取 beanType如果 beanType 上存在注解则进行处理。
2024-06-12 09:38:27
1460
原创 SpringBoot之静态资源
我们在开发的过程中,可能会使用拦截器拦截(放行)指定路径的资源,所以需要指定前缀自定义静态资源访问前缀为/res/**spring:mvc:演示静态资源的访问访问路径 http://localhost:8080/b.jpeg加上自定义前缀/res/**访问路径 http://localhost:8080/res/b.jpeg自定义静态资源访问前缀会导致默认静态资源形式的欢迎页功能失效spring:mvc:web:resources:访问路径。
2024-06-05 09:57:46
1420
原创 阅读 Spring(SpringBoot)源码的一些实用技巧
我们在阅读Spring(SpringBoot)源码的时候,有可能会被一下前置知识点卡住,影响继续阅读的动力。根据我对Spring的理解,整理一些实用的技巧,减少大家的阅读障碍。如果有什么不正确的地方欢迎大家指正、补充。
2024-06-05 09:24:55
1228
原创 SpringBoot之@AutoConfigureBefore、@AutoConfigureAfter、@AutoConfigureOrder注解
SpringBoot通过@AutoConfigureOrder、@AutoConfigureBefore、@AutoConfigureAfter注解,控制自动配置类的实例化顺序。
2024-05-28 15:54:47
2595
原创 Mybatis之@MapKey
演示返回单行、多行数据,使用@MapKey和不使用@MapKey注解的区别,然后通过源码解析产生各种结果的原因。
2024-05-21 09:25:53
2563
原创 Mybatis之returnInstanceForEmptyRow、callSettersOnNulls
指定当结果集中值为 null 的时候是否调用映射对象的 setter(map 对象时为 put)方法,这在依赖于 Map.keySet() 或 null 值进行初始化时比较有用。当返回行的所有列都是空时,MyBatis默认返回 null。请注意,它也适用于嵌套的结果集(如集合或关联)。方法, foundValues被设置为true。(未指定构造方法,使用的默认构造方法)方法, foundValues被设置为true。(未指定构造方法,使用的默认构造方法),并将foundValues值设置为true。
2024-05-21 09:03:18
1255
原创 Mybatis自定义RowBounds、ResultHandler
我们使用Mybatis的时候,一些参数基本上都是用的默认值。这篇博文我们一起来探究一下,如何自定义RowBounds、ResultHandler以及相关源码解析一共查出来三条数据,mybstis也处理了三条数据创建接口方法创建测试方法@Test// 获取sqlSession// 获取mapper执行测试方法一共查出来三条数据,mybstis仅处理俩条数据PS : 如果方法有多个参数类型为RowBounds,则抛出异常创建接口方法创建测试方法@Test// 获取sqlSession。
2024-05-17 10:34:31
1118
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人