ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

InheritableThreadLocal分析

2021-05-16 17:59:45  阅读:157  来源: 互联网

标签:分析 InheritableThreadLocal ThreadLocalMap threadLocal ThreadLocal inheritableThre


目录

1.简介

2.使用

3.源码分析

3.1.1 ThreadLocal

3.1.2 InheritableThreadLocal

3.1.3Thread.init()

4.总结


1.简介

InheritableThreadLocal作为ThreadLocal的扩展,本身要达到的目的依然是线程局部数据的存储,功能完全等同ThreadLocal,并在其基础上增加了父子线程减数据传递的功能,使用了Thread的另一个变量

ThreadLocal.ThreadLocalMap inheritableThreadLocals = null;

在new Thread(Runnable)的时候,会执行init初始化方法,进而将父线程的inheritableThreadLocals数据传递给子线程,详见源码分析第三节。

2.使用

demo

public class MyThread_localThreadTest {

    public static ThreadLocal<String> threadLocal = new ThreadLocal<>();
    public static ThreadLocal<String> inheritableThreadLocal = new InheritableThreadLocal<>();

    public static void main(String[] args) {
        threadLocal.set("threadLocal 的值: hello threadLocal");
        inheritableThreadLocal.set("inheritableThreadLocal 的值: hello inheritableThreadLocal");

        new Thread(()-> {
            System.out.println("子线程获取到的值--threadLocal:" + threadLocal.get());
            System.out.println("子线程获取到的值--inheritableThreadLocal:" + inheritableThreadLocal.get());

            System.out.println("==================================");

            new Thread(()->{
                System.out.println("孙子线程获取到的值--threadLocal:" + threadLocal.get());
                System.out.println("孙子线程获取到的值--inheritableThreadLocal:" + inheritableThreadLocal.get());
            }).start();

        }).start();
    }
}

输出:

子线程获取到的值--threadLocal:null
子线程获取到的值--inheritableThreadLocal:inheritableThreadLocal 的值: hello inheritableThreadLocal
==================================
孙子线程获取到的值--threadLocal:null
孙子线程获取到的值--inheritableThreadLocal:inheritableThreadLocal 的值: hello inheritableThreadLocal

 

3.源码分析

3.1.1 ThreadLocal

上篇我们分析了ThreadLocal,点击详细

这里我们着重分析InheritableThreadLocal

3.1.2 InheritableThreadLocal

public class InheritableThreadLocal<T> extends ThreadLocal<T> {

	@Override
    protected T childValue(T parentValue) {
        return parentValue;
    }

	@Override
    ThreadLocalMap getMap(Thread t) {
       return t.inheritableThreadLocals;
    }


	@Override
    void createMap(Thread t, T firstValue) {
        t.inheritableThreadLocals = new ThreadLocalMap(this, firstValue);
    }
}

InheritableThreadLocal重写了ThreadLocal的getMap(),createMap()方法,转而使用了新的变量,而在new Thread()时会根据条件初始化该变量

3.1.3Thread.init()

private void init(ThreadGroup g, Runnable target, String name,
				  long stackSize, AccessControlContext acc,
				  boolean inheritThreadLocals) {
	....省略无关代码
	if (inheritThreadLocals && parent.inheritableThreadLocals != null)
		this.inheritableThreadLocals = ThreadLocal.createInheritedMap(parent.inheritableThreadLocals);
	

继续跟踪ThreadLocal.createInheritedMap(parent.inheritableThreadLocals);

static ThreadLocalMap createInheritedMap(ThreadLocalMap parentMap) {
    return new ThreadLocalMap(parentMap);
}

而new ThreadLocalMap(parentMap);就是对数据的复制

private ThreadLocalMap(ThreadLocalMap parentMap) {
	Entry[] parentTable = parentMap.table;
	int len = parentTable.length;
	setThreshold(len);
	table = new Entry[len];

	for (int j = 0; j < len; j++) {
		Entry e = parentTable[j];
		if (e != null) {
			@SuppressWarnings("unchecked")
			ThreadLocal<Object> key = (ThreadLocal<Object>) e.get();
			if (key != null) {
				Object value = key.childValue(e.value);
				Entry c = new Entry(key, value);
				int h = key.threadLocalHashCode & (len - 1);
				while (table[h] != null)
					h = nextIndex(h, len);
				table[h] = c;
				size++;
			}
		}
	}
}

 

4.总结

简单明了,但是现目前的项目中,我们更多的使用的是线程池,故而其使用场景不是特别广泛。

标签:分析,InheritableThreadLocal,ThreadLocalMap,threadLocal,ThreadLocal,inheritableThre
来源: https://blog.csdn.net/yangzsirr/article/details/116896864

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有