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

外賣(mài)等實(shí)踐項(xiàng)目問(wèn)題記錄(1)

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

最近在復(fù)盤(pán)重新黑馬還有尚硅谷一些項(xiàng)目,發(fā)現(xiàn)我們?cè)谑褂毛@取當(dāng)前用戶(hù)id這項(xiàng)功能的時(shí)候主要是使用ThreadLocal來(lái)進(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)前用戶(hù)的id:", userId);
            BaseContext.setCurrentId(userId);
            //3、通過(guò),放行
            return true;
        } catch (Exception ex) {
            //4、不通過(guò),響應(yīng)401狀態(tài)碼
            response.setStatus(401);
            return false;
        }
    }
}

獲?。?/strong>

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

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

原因分析

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

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

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

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

如果線程池中的線程被復(fù)用,而ThreadLocal沒(méi)有及時(shí)清理,可能會(huì)導(dǎo)致數(shù)據(jù)污染。例如,前一個(gè)請(qǐng)求的用戶(hù)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方法...");
    // 在這里編寫(xiě)請(qǐng)求結(jié)束后的邏輯,例如清理ThreadLocal數(shù)據(jù)
    BaseContext.removeCurrentId(); // 清理當(dāng)前用戶(hù)ID
}

使用afterCompletion方法

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

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

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

相關(guān)推薦

04-16 20:02
已編輯
哈爾濱工程大學(xué) Java
點(diǎn)贊 評(píng)論 收藏
分享
ok,那么正式開(kāi)坑吧,個(gè)人而言因?yàn)镴ava實(shí)在競(jìng)爭(zhēng)太激烈,(在月薪3k的小廠,有十幾個(gè)人去面試競(jìng)爭(zhēng),甚至有個(gè)天津大學(xué)的985碩士和我搶飯碗,我決定直接跳車(chē),不卷了)所以投入大模型的學(xué)習(xí)之中。那么目標(biāo)自然是做agent開(kāi)發(fā)或者大模型開(kāi)發(fā)了,這里很多人會(huì)問(wèn),現(xiàn)在去找大模型好找嗎?我明確的說(shuō),我不知道,但我要all&nbsp;in,因?yàn)榇竽P凸べY實(shí)習(xí)工資比java開(kāi)發(fā)更高,而且它更新,這是為什么我要學(xué)它。然后很多人就是說(shuō)這個(gè)東西是不是現(xiàn)在沒(méi)有什么成體系的學(xué)習(xí)資料,我明確的說(shuō),是的,以我自身就是純按照興趣+boss招聘信息去學(xué),因?yàn)楹芏喙咀约阂矝](méi)整明白,有非常多小公司初創(chuàng)公司招這個(gè),競(jìng)爭(zhēng)激烈程度大概是56個(gè)人...
創(chuàng)作發(fā)文得獎(jiǎng)勵(lì):看到有人在聊創(chuàng)作者激勵(lì),啪的一下,我就點(diǎn)進(jìn)來(lái)了,很快?。∧贻p人好好更新,獎(jiǎng)勵(lì)大大的有查看圖片
點(diǎn)贊 評(píng)論 收藏
分享
評(píng)論
1
4
分享

創(chuàng)作者周榜

更多
正在熱議
更多
# 面試問(wèn)題記錄 #
71401次瀏覽 1025人參與
# 上班到公司第一件事做什么? #
40611次瀏覽 383人參與
# 京東TGT #
53010次瀏覽 188人參與
# 工作中,你有沒(méi)有遇到非常愛(ài)罵人的領(lǐng)導(dǎo)? #
19986次瀏覽 142人參與
# 硬件人的簡(jiǎn)歷怎么寫(xiě) #
257223次瀏覽 2899人參與
# 求職季如何保持心態(tài)不崩 #
106559次瀏覽 868人參與
# 找工作的破防時(shí)刻 #
2096次瀏覽 40人參與
# 工作時(shí)那些社死瞬間 #
25784次瀏覽 196人參與
# 拼多多工作體驗(yàn) #
17798次瀏覽 153人參與
# 互聯(lián)網(wǎng)行業(yè)現(xiàn)在還值得去嗎 #
7381次瀏覽 42人參與
# 技術(shù)轉(zhuǎn)行的心路歷程 #
48482次瀏覽 665人參與
# 選完offer后,你后悔學(xué)本專(zhuān)業(yè)嗎 #
38814次瀏覽 215人參與
# 你覺(jué)得技術(shù)面多長(zhǎng)時(shí)間合理? #
87207次瀏覽 647人參與
# 國(guó)企和大廠硬件兄弟怎么選? #
121005次瀏覽 1656人參與
# 你遇到過(guò)哪些神仙同事 #
74998次瀏覽 663人參與
# 面試經(jīng)驗(yàn)談 #
48014次瀏覽 743人參與
# 安利/避雷我的專(zhuān)業(yè) #
67086次瀏覽 495人參與
# 米哈游求職進(jìn)展匯總 #
322790次瀏覽 2223人參與
# 實(shí)習(xí)生應(yīng)該準(zhǔn)時(shí)下班嗎 #
203357次瀏覽 1323人參與
# 面試吐槽bot #
17974次瀏覽 104人參與
# 工作一周年分享 #
20120次瀏覽 111人參與
牛客網(wǎng)
??推髽I(yè)服務(wù)