ThreadLocal和InheritableThreadLocal的使用

非 Y 不嫁゛ 提交于 2019-12-06 15:45:00

今天在看一个开源项目的时候注意到InheritableThreadLocal类,之前接触的一般都是ThreadLocal类。ThreadLocal这个类大家都比较熟悉。

一句话解释就是这个ThreadLocal存放的是各线程独立的“对象数据”,各线程互不干扰,也不能共享访问,避免并发问题。而InheritableThreadLocal要解决的是要在所有线程中全局共享同一个对象, 所以在当前线程上创建一个新的线程实例Thread时,会把这些线程变量从当前线程传递给新的线程实例(把父线程的数据传递给新线程)。(此时线程变量不再线程安全,需要考虑线程安全问题) ,之前面试的时候问道多线程之间怎样共享数据,方式其实有很多,比如:

1、共享存储系统保存对象(redis缓存、文件形式等)

2、创建共享对象通过值传递给新的线程

3、静态变量的形式

4、多线程共用 Runnable对象

现在看来是用InheritableThreadLocal也是不错的一种方式。

ThreadLocal和InheritableThreadLocal的区别就是:

InheritableThreadLocal可以获取父级线程的内容,而ThreadLocal不能。

使用方式及源码参考:

public class ThreadLocalContext extends InheritableThreadLocal<RequestContext> {

    private static final RequestIDGenerator requestIdGenerator = RequestIDGenerator.getInstance();
    private static final ThreadLocalContext instance = new ThreadLocalContext();

    @Override
    protected RequestContext initialValue() {
        return new RequestContext(requestIdGenerator.nextId());
    }

    public static HttpServletRequest getServletRequest() {
        return instance.get().getOriginRequest();
    }

    public static RequestContext getRequestContext() {
        return instance.get();
    }

    public static void clear() {
        instance.remove();
    }
}

下面是几篇ThreadLocal和InheritableThreadLocal深入介绍的文章,这里就不再深入了。

Java 多线程:InheritableThreadLocal 实现原理

java concurrency in practice读书笔记---ThreadLocal原理

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!