ThreadLocal 用完没清,线程池复用导致数据串号

线程池里的线程会被反复借用,ThreadLocal 不清干净,下一个请求就读到别人的数据。

保存用户上下文的写法要包在 try 里,finally 中调用 remove 释放。

排查时看是不是请求间串号、且只在复用线程的服务上出现,就能确认。

private static final ThreadLocal<UserCtx> CTX = new ThreadLocal<>();

try {
    CTX.set(user);
    doBusiness();
} finally {
    // 线程池场景必须清,否则下个任务读到上一个用户
    CTX.remove();
}
THE END
喜欢就支持一下吧
点赞7 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容