threadlocal.get()为空 求解决

我在使用threadLocal的时候, 排查代码确认了, 是在一个线程下设置值的 但是后面获取就为null,这是什么原因造成的下面是代码

private static ThreadLocal<Map<String, Object>> threadLocal = new ThreadLocal<Map<String, Object>>();

public static void set(String key, Object value) {
    log.info("set value --> {}", Thread.currentThread().getName());
    Map<String, Object> map = threadLocal.get();
    if (CollectionUtils.isEmpty(map)) {
        map = Maps.newHashMap();
    }
    map.put(key, value);
    threadLocal.set(map);
    log.info("value----> {}", threadLocal.get().get(key));
}

public static Object get(String key){
    log.info("get value --> {}", Thread.currentThread().getName());
    Map<String, Object> map = threadLocal.get();
    if (CollectionUtils.isEmpty(map)) {
        map = Maps.newHashMap();
        threadLocal.set(map);
    }
    return  map.get(key);
}

threadLocal类,线程间数据是隔离的。如果你在线程一中存储的数据,线程二就拿不到数据。

  1. 打set/get时候的线程名字打印出来看看是否是同一个线程呀,比如:
system.out.println(threadA.getName();+" 执行中")

看下key是不是一樣的吧!还有Map打印下