- 博客(9)
- 收藏
- 关注
原创 记一次生产问题的排查思路
有的,我们使用了Alibaba 开源的 Java 诊断工具Arthas,以下是官方对这个工具的介绍:Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。最近系统出现一个很奇怪的问题,用户登录变得十分缓慢,平均登录时间在10-20s不等,并且伴随出现了堆内存告警,重启服务后问题依然存在,此问题严重影响了系统正常使用。
2024-01-02 15:55:35 988
原创 AQS之Condition条件队列源码解析
Condition条件队列是一个单向链表结构,调用await方法的线程会被阻塞执行,包装成节点并加入链表尾部。线程调用signal其实就是将条件队列节点向阻塞队列转移的过程,无论是否发生中断,节点都会转移到阻塞队列,然后阻塞等待获取锁。await方法是默认响应中断的,条件队列中的线程如果在await期间被中断,会设置中断状态,并在获取锁后抛出异常。而lock方法是不响应中断的,如果希望响应中断可以使用lockInterruptibly。
2023-09-27 14:29:32 123
原创 ReentrantLock实现原理及源码分析
tryAcquire-线程尝试获取锁,如果不存在锁竞争,就直接返回,它没有操作阻塞队列addWaiter-将线程包装成node节点并CAS加入阻塞队列队尾acquireQueued-自旋的方式获取锁,如果不能获取,则设置前驱节点为waitStatus=-1,表示等待被唤醒,然后线程挂起waitStatus=-1的意思是代表后继节点需要被唤醒,为什么这么说呢?
2023-09-08 15:33:40 143
原创 Spring事件监听机制使用及原理分析
Spring事件监听机制,通过ApplicationEvent以及Listener提供事件的订阅与处理,其内部是基于观察者模式的应用。当定义的某个事件被广播出去后,所有订阅该事件的Listener都会被通知而出发相应处理,该模式可运用与业务逻辑间解耦,提高系统可扩展性与可维护性。例如我们在完登录成功后需要发送短信通知,那么可以通过发布异步事件的方式触发短信相关业务。} }System . out . println("发送邮件...." + event . getSource());} }
2023-07-17 14:59:03 405
原创 SpringBoot嵌入式容器自动配置及启动原理
getWebServerFactory()方法从spring容器中获取了web容器,我们看一下这个方法的代码,从容器中获取类型是ServletWebServerFactory的bean,并且判断了web容器只能存在一个,断点看到获取的是TomcatServletWebServerFactory,可以知道默认返回的web容器是tomcat的。3.通过分析springboot自动装配过程,我们知道默认启动的web容器类是TomcatWebServer,ServerProperties是对应的配置类。
2023-06-21 17:26:12 304
原创 ThreadPoolExecutor源码解析
编写本文主要目的是对线程池的设计思想和关键源码实现进行剖析,一方面加深自己的理解,另一方面帮助记忆。因为网上有太多关于线程池使用介绍文章,有些基本的概念便不再赘述,ThreadPoolExecutor源码总的来说并不复杂,Doug Lea大神的代码非常优雅,思路清晰设计巧妙。废话少说,下面开始正文。
2023-05-19 16:25:35 155 1
原创 Spring AOP源码解析
AOP(Aspect-Oriented Programming:面向切面编程)能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。Spring AOP 就是基于动态代理的,如果要代理的对象,实现了某个接口,那么 Spring AOP 会使用JDK Proxy。
2023-05-05 11:13:33 205 1
原创 浅析SpringBoot自动装配原理
ImportSelector接口的作用:selectImports方法返回数组是自动配置类的全限定名,执行完这个方法返回要导入哪些组件,容器加载时这些组件会自动注入spring容器,这些组件是从哪里获取的?@EnableConfigurationProperties(DataSourceProperties.class)启用了数据源的配置类,我们可以在配置文件中使用例如spring.datasource.url=xxx进行赋值来传入自定义的值。以DataSourceAutoConfiguration为例。
2023-04-26 15:52:37 157 1
原创 记录@ConfigurationProperties注解注入集合配置的报错
在HostConfig类中由于重写了构造方法,默认的无参构造就不存在了,spring容器启动时实例化配置类的成员变量是调用的无参构造方法,这里初始化就会报错,如果是配置文件注入的话可以指定spring初始化时调用有参的构造方法,但这里使用了注解注入,所以一定要注意保留无参构造来保证spring容器初始化成功//在HostConfig.java新增无参构造后可以启动成功 public HostConfig() {
2023-03-29 09:59:43 853 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人