欧美1区2区3区激情无套,两个女人互添下身视频在线观看,久久av无码精品人妻系列,久久精品噜噜噜成人,末发育娇小性色xxxx

外賣等實(shí)踐項(xiàng)目問題記錄(1)

ThreadLocal內(nèi)存泄漏問題

最近在復(fù)盤重新黑馬還有尚硅谷一些項(xiàng)目,發(fā)現(xiàn)我們?cè)谑褂毛@取當(dāng)前用戶id這項(xiàng)功能的時(shí)候主要是使用ThreadLocal來進(jìn)行存取

定義:

public class BaseContext {

    public static ThreadLocal<Long> threadLocal = new ThreadLocal<>();

    public static void setCurrentId(Long id) {
        threadLocal.set(id);
    }

    public static Long getCurrentId() {
        return threadLocal.get();
    }

    public static void removeCurrentId() {
        threadLocal.remove();
    }

}

存入:

/**
 * jwt令牌校驗(yàn)的攔截器
 */
@Component
@Slf4j
public class JwtTokenUserInterceptor implements HandlerInterceptor {

    @Autowired
    private JwtProperties jwtProperties;
    
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //判斷當(dāng)前攔截到的是Controller的方法還是其他資源
        if (!(handler instanceof HandlerMethod)) {
            //當(dāng)前攔截到的不是動(dòng)態(tài)方法,直接放行
            return true;
        }

        //1、從請(qǐng)求頭中獲取令牌
        String token = request.getHeader(jwtProperties.getUserTokenName());

        //2、校驗(yàn)令牌
        try {
            log.info("jwt校驗(yàn):{}", token);
            Claims claims = JwtUtil.parseJWT(jwtProperties.getUserSecretKey(), token);
            Long userId = Long.valueOf(claims.get(JwtClaimsConstant.USER_ID).toString());
            log.info("當(dāng)前用戶的id:", userId);
            BaseContext.setCurrentId(userId);
            //3、通過,放行
            return true;
        } catch (Exception ex) {
            //4、不通過,響應(yīng)401狀態(tài)碼
            response.setStatus(401);
            return false;
        }
    }
}

獲?。?/strong>

//清空當(dāng)前用戶的購(gòu)物車數(shù)據(jù)
shoppingCartMapper.deleteByUserId(BaseContext.getCurrentId());

但我們知道ThreadLocal是存在內(nèi)存泄漏問題的

原因分析

ThreadLocal的工作原理 ThreadLocal通過為每個(gè)線程維護(hù)一個(gè)獨(dú)立的變量副本,實(shí)現(xiàn)了線程間的數(shù)據(jù)隔離。具體來說,ThreadLocal的值存儲(chǔ)在Thread對(duì)象的ThreadLocalMap中,鍵是ThreadLocal實(shí)例,值是存儲(chǔ)的數(shù)據(jù)。

內(nèi)存泄漏的可能性

如果ThreadLocal變量沒有被正確清理(調(diào)用remove()方法),即使ThreadLocal實(shí)例本身被回收,ThreadLocalMap中的鍵(弱引用)可能已經(jīng)被回收,但值仍然存在,導(dǎo)致無法釋放內(nèi)存。這種情況尤其容易發(fā)生在使用線程池的場(chǎng)景中,因?yàn)榫€程池中的線程是復(fù)用的,線程的生命周期很長(zhǎng)。

我們整個(gè)項(xiàng)目里面只用到了存取ThreadLocal中的線程id,卻并沒有在方法結(jié)束后對(duì)ThreadLocal進(jìn)行remove這樣會(huì)造成一定的風(fēng)險(xiǎn)。

如果線程池中的線程被復(fù)用,而ThreadLocal沒有及時(shí)清理,可能會(huì)導(dǎo)致數(shù)據(jù)污染。例如,前一個(gè)請(qǐng)求的用戶ID殘留到了下一個(gè)請(qǐng)求中。

解決方案

在本項(xiàng)目中,我們可以修改原本的攔截器,在請(qǐng)求結(jié)束時(shí)統(tǒng)一清理ThreadLocal中的數(shù)據(jù)。例如:

@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    log.info("請(qǐng)求結(jié)束,執(zhí)行afterCompletion方法...");
    // 在這里編寫請(qǐng)求結(jié)束后的邏輯,例如清理ThreadLocal數(shù)據(jù)
    BaseContext.removeCurrentId(); // 清理當(dāng)前用戶ID
}

使用afterCompletion方法

afterCompletion的作用 afterCompletion方法在請(qǐng)求處理完成(包括視圖渲染)后執(zhí)行,無論請(qǐng)求是否成功或拋出異常。它適合用于清理資源、記錄日志等操作。

不知道我這樣做的是否正確,歡迎各位大佬指教!

#實(shí)習(xí)##蒼穹外賣項(xiàng)目包裝#
全部評(píng)論

相關(guān)推薦

04-10 01:18
已編輯
東北大學(xué) Java
想起多少寫多少============================自我介紹你的Java是自學(xué)的嗎你平時(shí)是怎么學(xué)習(xí)的項(xiàng)目拷打(問了好多我實(shí)際沒有做過的場(chǎng)景..)(面試官他們部門做的是類似的項(xiàng)目,問得很細(xì),????已經(jīng)被拷打麻了,感覺對(duì)于面試官來說我的玩具項(xiàng)目就像以卵擊石,大寄特寄)============================八股一條更新的sql語句,會(huì)涉及到哪些日志的更新,說出他們更新的流程(具體細(xì)節(jié)忘了,只說了個(gè)大概,有點(diǎn)寄)線程池的核心參數(shù)線程池的執(zhí)行流程你知道的線程池有哪些為什么不使用jdk自帶的線程池為什么會(huì)產(chǎn)生死鎖死鎖的避免synchronize鎖升級(jí)aqs原理reentrantlock和synchronize的區(qū)別redis&nbsp;cluster集群擴(kuò)容流程(忘記了,胡說八道了個(gè)一致性哈希,寄)兩道SQL題,問走不走索引(????已經(jīng)被拷打得頭昏眼花了,答錯(cuò)了??,大寄特寄)手撕出現(xiàn)頻率最高的k個(gè)單詞(大寄特寄)(相同頻率的單詞按照字典序排序,????忘記comparator這個(gè)單詞怎么寫了??,面試官說思路是對(duì)的)反問部門業(yè)務(wù)對(duì)于沒有實(shí)習(xí)過的學(xué)生,怎么去提高項(xiàng)目的相關(guān)經(jīng)驗(yàn)------------------------------------------------個(gè)人總結(jié)還是太菜了,很多東西深度理解不夠。項(xiàng)目還有很多地方自己沒有實(shí)現(xiàn)的地方可能還需要結(jié)合實(shí)際情況去進(jìn)行思考(即使你沒有寫還是會(huì)被拷打??)代碼一旦脫離了idea沒有代碼補(bǔ)全就寫得一塌糊涂唉,繼續(xù)加油吧.#??虯I配圖神器#
查看20道真題和解析
點(diǎn)贊 評(píng)論 收藏
分享
評(píng)論
1
4
分享

創(chuàng)作者周榜

更多
??途W(wǎng)
??推髽I(yè)服務(wù)