- 博客(4)
- 收藏
- 关注
原创 JWT+ThreadLocal相关 - 黑马点评项目面试题准备
但是 ThreadLocal 也有内存泄漏风险,因为它的 key 是弱引用,而 value 是强引用,如果使用完不手动调用 remove() 方法,value 可能被线程池中的线程长期持有,无法被 GC 回收。而存入信息到ThreadLocal的线程可能是线程池中的线程,不会很快销毁,即使key被GC回收了,但是value依然被线程内部的ThreadLocalMap.Entry强引用着,因此value不会被GC自动回收,需要手动remove。强引用指,永不被GC自动回收,只要强引用还存在,内存就不会释放。
2025-05-12 09:41:26
323
原创 黑马点评—优惠券秒杀相关
具体场景举例:线程1获取Redis分布式锁后执行业务逻辑,但是由于某种原因导致其业务阻塞直到Redis分布式锁被自动释放,此时线程2可以重新获取释放后的Redis分布式锁然后执行自己的任务,如果在线程2执行自己任务的过程中,线程1阻塞结束并且完成了自己的业务,按照之前的设计此时线程1会释放Redis分布式锁,但是由于当前的Redis分布式锁已经被线程2持有,所以线程1实际上释放的是线程2的Redis分布式锁,因此出现Redis分布式锁误删的情况。另外由于使用的是内存,如果服务宕机,用户的订单信息会丢失;
2025-04-21 19:26:09
688
原创 黑马点评--缓存相关
如果命中,即查询到数据,则直接返回。由于缓存的操作时间少于操作数据库的时间,并且查询数据库的时间一般是少于更新数据库的时间的,因此在更新数据库的过程中很有可能出现其他线程查询缓存未命中,再查询数据库数据重新写入缓存中,因为这时的数据库更新操作还未完成,所以会出现旧数据回填的错误,且发生概率相对较高。客户端的请求会先到达布隆过滤器,判断请求查询的数据是否存在,如果不存在则直接拒绝该请求,如果存在则放行,继续和之前查询相同的逻辑(先到Redis缓存中查询,如果缓存未命中再查询数据库)。缺点:① 自己实现复杂;
2025-04-12 09:56:14
667
原创 黑马点评--短信登录功能
可以在拦截器中获取用户信息后保存至ThreadLocal中,因为ThreadLocal是一个线程对象,而每一个进入Tomcat的请求都是一个独立的线程,之后ThreadLocal会在线程内开辟一个内存空间去保存对应的用户,这样就实现了每个线程互不干扰。但是随着业务开发,功能模块会增多,对应的Controller也会增加,每个业务都需要对用户登录状态进行校验以保证账号安全,这就意味着在每个Controller对应的业务实现代码里都要写上一段校验用户登录状态的相关代码,导致代码冗余问题。
2025-04-10 00:10:48
676
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人