ThreadLocal(线程本地变量)通常理解为“采用了空间换时间的设计思想,主要用来实现在多线程环境下的线程安全和保存线程上下文中的变量”。在实际的项目开发中(比如2C APP程序的服务器端程序),通常在APP调用服务端API接口的时候,需要token(登录)验证并且在具体的方法中可能会使用到当前登录账户的更多信息(比如当前登录账户的用户ID)。以前的做法,我们喜欢把(通过token获取)用户登录信息放在http请求的request请求对象中,但是这样做是耦合性很强,比较相同的代码重复使用。通过了解ThreadLocal的特性后,这种情况使用ThreadLocal来实现会很合适。下面我们将讲解具体的使用方法。
一、利用ThreadLocal实现中间类来保存登录信息
package com.example.demo.common.session;
/**
* 利用线程本地变量来保存登录信息
*
* @author Horace
*
*/
public class SessionCache {
private static ThreadLocal<Session> threadLocal = new ThreadLocal<>();
public static <T extends Session> void put(T t) {
threadLocal.set(t);
}
@SuppressWarnings("unchecked")
public static <T> T get() {
return (T) threadLocal.get();
}
public static void remove() {
threadLocal.remove();