摘要: 一. JVM类加载的双亲委派模型 以上图为例, 当加载String时,App ClassLoader会委托给上级extension ClassLoader/platform ClassLoader加载,而extension ClassLoader/platform ClassLoader会委托给它的 阅读全文
posted @ 2025-07-08 22:31 Charlie-Pang 阅读(5) 评论(0) 推荐(0)
摘要: 一. 如何保证多线程环境下A、B、C、三个任务顺序执行。 用Thread.join public static void main(String[] args) { Thread thread1= new Thread(() -> { System.out.println("thread1线程启动了 阅读全文
posted @ 2025-07-08 21:53 Charlie-Pang 阅读(8) 评论(0) 推荐(0)
摘要: ThreadLocal内部结构 ThreadLocal的实现原理是通过set把value set到线程的threadlocals属性中, threadlocals是一个Map,其中的key是ThreadLocal的this引用,value是我们所set的值 一. 为什么ThreadLocal会内存泄 阅读全文
posted @ 2025-07-08 21:41 Charlie-Pang 阅读(13) 评论(0) 推荐(0)
摘要: jdk1.7:采用分段锁,segment继承reentrantLock是线程安全的,默认是16个,支持16个线程并发执行。 HashEntry数组支持扩容,如果HashEntry地址存在数据,则会在地址下面挂一个链表,将数据放入链表中。 jdk1.8:采用分段锁 key和value不能为null 如 阅读全文
posted @ 2025-07-08 17:39 Charlie-Pang 阅读(4) 评论(0) 推荐(0)
摘要: map家族 一. HashMap的数据结构: jdk1.7结构是:数组+链表 jdk1.8结构是:数组+链表+红黑树 二. HashMap性能参数: 初始容量capacity:创建数组的长度默认是16,如果太少,很容易触发扩容,如果太多,遍历数组会比较慢。 负载因子loadFactor:一个衡量的尺 阅读全文
posted @ 2025-07-08 16:56 Charlie-Pang 阅读(8) 评论(0) 推荐(0)
摘要: 一. Mybatis框架式如何实现分页的? 逻辑分页:将所有数据查询出来,在内存中进行分页处理。 物理分页:直接在数据库中进行分页。 具体实现: 自己写sql进行物理分页。 使用拦截器进行物理分页。 使用PageHelper进行物理分页。 RowBounds进行逻辑分页。 二. MyBatis中的缓 阅读全文
posted @ 2025-07-08 15:50 Charlie-Pang 阅读(11) 评论(0) 推荐(0)
摘要: 1、线程池的基本描述 /** * corePoolSize: 线程池中的核心线程数,默认情况下,只有核心线程会执行任务。 * new之后,线程池并不会立即创建该核心线程,而是会等待任务加入队列,当任务加入队列后,才会创建核心线程。 * * maximumPoolSize: 线程池中的最大线程数,默认 阅读全文
posted @ 2025-07-08 12:20 Charlie-Pang 阅读(5) 评论(0) 推荐(0)
摘要: ApplicationContext就是IOC容器 @Bean是通过工厂方法或构造器创建的,和IOC容器不同,IOC容器是通过反射创建的。 SpringIOC容器初始化过程 1、Spring容器中的Bean默认都是单例的,但是并不是线程安全的,所有线程都共享一个单例Bean,因此存在资源竞争的关系。 阅读全文
posted @ 2025-07-08 10:01 Charlie-Pang 阅读(10) 评论(0) 推荐(0)
摘要: 1、redis的淘汰策略:默认是noeviction。 2、redis中String的类型能大的的数据 3、如何保证数据库与redis的数据一致性? a、延迟双删 缺点:写操作过于频繁,还是会存在脏数据 假设只删一次缓存: A 线程先查 Redis 缓存,未命中; B 线程更新 MySQL 数据并删 阅读全文
posted @ 2025-07-08 09:23 Charlie-Pang 阅读(7) 评论(0) 推荐(0)
摘要: 描述:大量的key过期。或者缓存系统崩溃,导致所有的请求打到数据库上。 解决方案: 1、redis要高可用(使用redis cluster集群)。 2、给不同的key设置不同的过期时间; 3、本地缓存(二级缓存)+限流&降级,避免数据库被压垮; 阅读全文
posted @ 2025-07-08 08:57 Charlie-Pang 阅读(9) 评论(0) 推荐(0)
摘要: 当redis数据失效或者项目刚启动redis还没有对热点数据进行缓存,导致所有数据都会查询数据库。数据库有可能会被压垮。 解决办法: 1、全局锁 当查询redis时,如果redis没有数据,则获取全局锁,如果获取到锁,查询数据库,如果没有获取到锁,则尝试再次获取锁,假如拿到锁之后,先检查redis是 阅读全文
posted @ 2025-07-08 08:56 Charlie-Pang 阅读(14) 评论(0) 推荐(0)
摘要: 请求一个不存在的数据 请求-》redis-》数据库:redis查询不到,请求数据库,数据库也不存在,返回给前端 后果:有可能被恶意用不存在的值查询数据库,导致数据库的压力过大。 解决办法: 1、将数据库不存在的数据缓存在数据库中,可以有效的解决这种问题。 2、布隆过滤器有一定的误判概率,判断某个元素 阅读全文
posted @ 2025-07-08 08:36 Charlie-Pang 阅读(10) 评论(0) 推荐(0)
摘要: redisson的分布式锁是可重入的 redis锁的问题: 1、不是原子操作 设置获取锁和设置锁超时不是原子操作,有可能导致获取锁成功,但是设置锁过期时间失败,这样任务执行会出现不可控的情况。 获取锁 setnx key value 设置锁过期时间 expire key 30 执行业务代码 释放锁 阅读全文
posted @ 2025-07-08 08:07 Charlie-Pang 阅读(36) 评论(0) 推荐(0)