ThreadLocal与线程安全
项目地址:misszb项目下的LocalUser类
需求
将当前登录的用户信息、API接口的scope保存到静态类中,以便在service、controller里使用
分析
由于有多个用户登录,所以有多个用户信息,这种数据保存常用的是List、ArrayList、Map
List、ArrayList保存容易,但取出来麻烦
Map 无法保证线程安全
推荐使用ThreadLocal
实现
java
package com.zb.misszb.core;
import com.zb.misszb.model.User;
import java.util.HashMap;
import java.util.Map;
public class LocalUser {
private static ThreadLocal<Map<String, Object>> threadLocal = new ThreadLocal<>();
public static void set(User user, Integer scope) {
Map<String, Object> map = new HashMap<>();
map.put("user", user);
map.put("scope", scope);
LocalUser.threadLocal.set(map);
}
public static User getUser() {
Map<String, Object> map = LocalUser.threadLocal.get();
User user = (User) map.get("user");
return user;
}
public static Integer getScope() {
Map<String, Object> map = LocalUser.threadLocal.get();
Integer scope = (Integer)map.get("scope");
return scope;
}
public static void clear() {
LocalUser.threadLocal.remove();
}
}
将user和scope生成map格式,存放到ThreadLocal中
总结
如果即想实现多线程安全,可以使用ThreadLocal