以下是使用ThreadLocal实现用户会话隔离的完整示例,模拟Web应用中每个请求线程的用户会话隔离:
public class UserSessionHolder {
private static final ThreadLocal
public static void set(UserSession session) {
sessionHolder.set(session);
}
public static UserSession get() {
return sessionHolder.get();
}
public static void clear() {
sessionHolder.remove();
}
}
class UserSession {
private String userId;
private String username;
private long loginTime;
// 构造方法、getter和setter
public UserSession(String userId, String username) {
this.userId = userId;
this.username = username;
this.loginTime = System.currentTimeMillis();
}
// 省略getter/setter方法...
}
class RequestHandler implements Runnable {
private final UserSession session;
public RequestHandler(UserSession session) {
this.session = session;
}
@Override
public void run() {
try {
UserSessionHolder.set(session);
System.out.println(Thread.currentThread().getName()
+ " 处理用户: " + UserSessionHolder.get().getUsername());
// 模拟业务处理
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
UserSessionHolder.clear();
}
}
}
class Application {
public static void main(String[] args) {
// 模拟多个用户请求
ExecutorService executor = Executors.newFixedThreadPool(3);
for (int i = 1; i <= 5; i++) {
UserSession session = new UserSession("UID" + i, "User" + i);
executor.execute(new RequestHandler(session));
}
executor.shutdown();
}
}
该实现通过ThreadLocal为每个线程创建独立的用户会话副本,确保多线程环境下会话数据隔离。UserSessionHolder作为会话容器,RequestHandler模拟Web请求处理流程,最后在主程序中测试多用户场景。注意在finally块中清理ThreadLocal防止内存泄漏。