ThreadLocalUtils

1:  Map版

package cn.com.util;

import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

public class ThreadLocalUtils {

    private static ThreadLocal<Map<Object, Object>> RESOURCES;

    // 子线程可继承的ThreadLocal
    public static ThreadLocalUtils initInhert() {
        removeResources();
        RESOURCES = new InheritableThreadLocal();
        RESOURCES.set(new HashMap<>());
        return null;
    }

    public static void withInitial() {
        removeResources();
        RESOURCES = ThreadLocal.withInitial(() -> new HashMap<>());
    }

    public static void removeResources() {
        if (Objects.nonNull(RESOURCES)) {
            RESOURCES.remove();
        }
    }

    public static Map<Object, Object> getResources() {
        return RESOURCES.get();
    }

    public static void put(Object key, Object value) {
        Objects.requireNonNull(key, "key cannot be null");
        getResources().put(key, value);
    }

    public static Object get(Object key) {
        return getResources().get(key);
    }

    public static Object remove(Object key) {
        return getResources().remove(key);
    }

}

测试:

public static void main(String[] args) throws Exception {
        Map<Object, Object> resources = ThreadLocalUtils.initInhert().getResources();
        resources.put("111","aaa");
        System.out.println(ThreadLocalUtils.getResources());// {111=aaa}
        resources.put("222","bbb");
        System.out.println(ThreadLocalUtils.getResources());// {111=aaa, 222=bbb}
        Thread t = new Thread(() -> {
            Map<Object, Object> resourcesChild = ThreadLocalUtils.getResources();
            resourcesChild.put("333","ccc");
            System.out.println(ThreadLocalUtils.getResources());// {111=aaa, 222=bbb, 333=ccc}
        });
        t.start();
        Thread.sleep(2000L);
        System.out.println(ThreadLocalUtils.getResources());// {111=aaa, 222=bbb, 333=ccc}
    }
原文地址:https://www.cnblogs.com/bevis-byf/p/12426203.html