关键代码
// 定义ThreadLocal变量来存储用户会话对象
private static final ThreadLocal<UserSession> threadLocal = new ThreadLocal<>();
// 获取当前线程的用户会话对象
public UserSession getSession() {
UserSession session = threadLocal.get();
if (session == null) {
session = new UserSession();
threadLocal.set(session);
}
return session;
}
// 清理ThreadLocal中的会话对象,例如在请求处理结束时调用
public void cleanSession() {
threadLocal.remove();
}
原理解释
- ThreadLocal:它为每个线程提供了独立的变量副本。当多个线程访问
ThreadLocal
变量时,每个线程都会得到属于自己的变量实例,互不干扰。
get()
方法:用于获取当前线程对应的UserSession
对象。如果当前线程首次调用get()
,则threadLocal.get()
返回null
,此时创建一个新的UserSession
对象并通过threadLocal.set()
存储到当前线程的副本中。
set()
方法:将一个UserSession
对象存储到当前线程对应的副本中。
remove()
方法:在使用完毕后,清理当前线程副本中的UserSession
对象,避免内存泄漏。例如在Web应用中,一个请求处理完毕后调用此方法。这样可以确保每个线程都有自己独立的用户会话对象,在多线程环境下互不影响。