InheritableThreadLocal的理解

public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(1);
        inheritableRequestAttributesHolder.set("wocao");
        executorService.submit(() -> {
            String s = inheritableRequestAttributesHolder.get();
            System.out.println(s);
        });
        inheritableRequestAttributesHolder.set("hello啊");
        executorService.submit(() -> {
            String s = inheritableRequestAttributesHolder.get();
            System.out.println(s);
        });
    }

InheritableThreadLocal只有在创建线程的时候才会进行内容的复制,而使用线程池,线程是复用的,第一次创建的时候复制的内容是不会改的,后面inheritableRequestAttributesHolder.set("hello啊")了之后相当于就不起作用了。

InheritableThreadLocal的理解_第1张图片

所以重新new一个线程池的时候,因为会新建线程,所以内容刷新了。

总结:使用线程池的时候不要使用InheritableThreadLocal,会带来数据的不准确,如果非要使用,可以使用阿里巴巴的transmittableThreadLocal

你可能感兴趣的:(java,java)