Skip to content

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

如有转载或 CV 的请标注本站原文地址