ThreadLocal和InheritableThreadLocal的使用

原创
2018/01/11 23:41
阅读数 1.2K

今天在看一个开源项目的时候注意到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原理

 

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部