获取父线程 java_java子线程中获取父线程的threadLocal中的值

我们都知道线程本地变量表也就是ThreadLocal在我们做线程级的数据隔离时非常好用,但是有时候我们会想如何让子线程获取到父线程的ThreadLocal,其实在线程中除了ThreadLocal外还有InheritableThreadLocal,顾名思义,可继承的线程变量表,可以让子线程获取到父线程中ThreadLocal的值。

public classBaseTest {public static final InheritableThreadLocal inheritableThreadLocal = new InheritableThreadLocal<>();public static final ThreadLocal threadLocal = new ThreadLocal<>();public static voidmain(String[] args) {

inheritableThreadLocal.set("Inheritable hello");

threadLocal.set("hello");new Thread(()->{

System.out.println(String.format("子线程可继承值:%s",inheritableThreadLocal.get()));

System.out.println(String.format("子线程值:%s",threadLocal.get()));new Thread(()->{

System.out.println(String.format("孙子线程可继承值:%s",inheritableThreadLocal.get()));

System.out.println(String.format("孙子线程值:%s",threadLocal.get()));

}).start();

}).start();

}

执行后获取返回值。

d2a8eaf969e8edd54fd43ce15038f858.png

可以看到不可继承的ThreadLocal子线程是不能共享父线程的。可继承的ThreadLocal如何实现呢?

其原理和ThreadLocal基本上一致,都是线程中存有ThreadLocalMap

/*ThreadLocal values pertaining to this thread. This map is maintained

* by the ThreadLocal class.*/ThreadLocal.ThreadLocalMap threadLocals= null;/** InheritableThreadLocal values pertaining to this thread. This map is

* maintained by the InheritableThreadLocal class.*/ThreadLocal.ThreadLocalMap inheritableThreadLocals= null;

我们在new线程时init方法会有如下操作。

Thread parent =currentThread();

../省略代码if (inheritThreadLocals && parent.inheritableThreadLocals != null)this.inheritableThreadLocals =ThreadLocal.createInheritedMap(parent.inheritableThreadLocals);

如果允许new的线程继承当前线程的threadlocalMap,那么new的线程会copy一份当前线程也就是父线程的inheritableThreadLocals 。这儿也可以说明继承有两条件,new的线程允许继承(默认允许),父线程的inheritableThreadLocals 不为null。

**这儿要注意不管是创建ThreadLocal还是inheritableThreadLocals(如果父线程没有) 的ThreadLocalMap都是在Threadlocal.set方法的时候创建的,即懒加载。

public voidset(T value) {

Thread t=Thread.currentThread();

ThreadLocalMap map=getMap(t);if (map != null)

map.set(this, value);elsecreateMap(t, value);

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/303503.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

源码分享,送你一份Google Python class源码

几年前&#xff0c;Google推出Python课堂。Google Python课堂:https://developers.google.com/edu/python/小编也整理了一下Google Python课堂的源码&#xff0c;里面有四个例子。logpuzzle这个例子主要是利用urllib模块做一个图片拼接的小游戏,主要是从一大堆的网页里面解析分…

用YARP当网关

Yarp是微软开源的一个用.net实现的反向代理工具包&#xff0c;github库就叫reverse-proxy&#xff08;反向代理&#xff09;&#xff08;吐槽一下微软起名字233333&#xff09;nuget包preview9之前都叫Microsoft.ReverseProxy&#xff0c;preview10变成Yarp.ReverseProxy了放上…

nginx 反向代理+ip智能解析

ocation / { if ($request_uri ~ ^/refresh.do$) { proxy_pass http://edtnew; break; 一 } if ($request_method POST) { proxy_pass http://edtold; break; 二 …

yum java 1.7_centos通过yum安装jdk1.7或1.8

今天安装elasticsearch的时候提示which: no1、 检查系统是否自带有jdk[rootnetpc.com.cn software]# rpm -qa |grep java[rootnetpc.com.cn software]# rpm -qa |grep jdk[rootnetpc.com.cn software]# rpm -qa |grep gcj如果有信息输出则需要卸载掉原来的jdk版本&#xff0c;用…

从生物神经网络到人工神经网络

如今提及人工智能&#xff0c;大家期待的一定是某种可以“学习”的方法&#xff0c;这种方法使用数学模型从数据中获取模式的某种表示。在众多“学习”方法中&#xff0c;获得最多关注&#xff0c;承载最多期望的非“神经网络”莫属。既然我们将这种数学方法称作神经网络&#…

很遗憾,我们正在逐渐丧失专注阅读的能力

这是头哥侃码的第238篇原创最近生活没什么规律&#xff0c;睡得晚&#xff0c;起得早&#xff0c;似乎除了工作之外&#xff0c;其余所有的节奏都有点乱了。前几天去体检&#xff0c;没想到像我这样的 “老司机”&#xff0c;居然会忘记 “要空腹” 的规定&#xff0c;愣是在体…

socket案例一

编写一个网络应用程序&#xff0c;有客户端与服务器端&#xff1b;当客户端向服务器端发送请求时&#xff0c;客户端输出服务器端返回的字符串。 回顾下socket的开发步骤&#xff1a; 1) 建立Socket连接 2) 获得输入/输出流 3&#xff09;读/写数据 4) 关闭输入/输出流 5) 关闭…

java成员变量垃圾回收_JAVA 对象被垃圾回收后其成员变量可用吗? | 学步园

我们知道JVM中一个对象实例超出作用域或无引用的时候会被垃圾回收&#xff0c;那么他被垃圾回收后&#xff0c;依赖其成员变量的其他实例是否还能正常使用呢&#xff1f;经过测试后发现即使一个实例被垃圾回收&#xff0c;如果他内部的数据被其他对象使用&#xff0c;是不受影响…

陶哲轩的10岁与30岁

Terence Tao&#xff08;陶哲轩&#xff09;&#xff0c;1975年7月17日出生于澳大利亚Adelaide&#xff08;阿德莱德&#xff09;。本讲话作于1985年上半年&#xff0c;即陶哲轩尚未满10周岁时所作&#xff0c;一个稚气儿童&#xff0c;给大学生和教授们作报告&#xff0c;少见…

NET问答: 重写了 Equals,还有必要重写 GetHashCode 吗?

咨询区 David Basarab&#xff1a;直入主题&#xff0c;参考如下代码&#xff1a;public class Foo {public int FooId { get; set; }public string FooName { get; set; }public override bool Equals(object obj){Foo fooItem obj as Foo;if (fooItem null) {return false;…

【转载】DataKeyNames,DataKeys 用法浅谈

原文地址&#xff1a;http://www.cnblogs.com/amos/archive/2010/07/16/1778796.htmlDataKeyNames作为GridView中的一个属性&#xff0c;我们可以利用这个属性结合DataKeys方便的访问GridView中每个字段的值。先说怎么用DataKeyNames可以直接在GridView属性中设置&#xff0c;多…

如果编程替换成中文就会怎样? 程序员看了表示头疼

首先大概的看一下中文编码&#xff1a;你以为会写中文就会编程吗&#xff1f;这就像你以为会写汉字就会写出好文章一样。编程是和机器沟通&#xff0c;因此要用机器的语言而不是人类的语言。最早的程序就是0和1的数字&#xff0c;不是中文也不是英文。以前的程序员&#xff0c;…

java new 面试_java面试30问

第一&#xff0c;谈谈final, finally, finalize的区别。第二&#xff0c;Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类&#xff0c;是否可以implements(实现)interface(接口)?第三&#xff0c;Static Nested Class 和 Inner Class的不同&#xff0c;说得越…

使用visio 2016 绘制画UML时序图(Sequence Diagram)

什么是时序图&#xff1f;时序图(Sequence Diagram)&#xff0c;又名序列图、循序图&#xff0c;是一种UML交互图。它通过描述对象之间发送消息的时间顺序显示多个对象之间的动态协作。让我们来看一看Visio2016对时序图的的解释。时序图的元素我们在画时序图时会涉及到7种元素&…

网页颜色搭配

兼职请上猪八戒网站转载于:https://blog.51cto.com/ayyzddq/598474

数字化诗人:这可能是第一位用算法写诗的诺贝尔文学奖得主

一位英国教授发现&#xff0c;一些优秀的诗人早在20世纪60年代就开始使用编码算法来写诗了。著名作家J.M.Coetzee&#xff0c;在早期的英国超级计算机上开发了创作诗歌的软件当我们回顾历史上探索科技应用的人才时&#xff0c;通常不会想到英语教授。但是伦敦国王学院现代文学博…

在asp.net core中使用的验证框架FluentValidation

FluentValidation在asp.net core中怎么使用&#xff1f;先安装包。Install-Package FluentValidation.AspNetCore和上一篇的实体类和验证类一样。实体类&#xff1a;public class Person {public int Id { get; set; }public string Name { get; set; }public string Tel { get…

【EFCORE笔记】异步查询工作原理注释标记

异步查询 当在远程数据库中执行查询时&#xff0c;同步查询可能会阻止当前线程&#xff0c;异步查询可避免阻止线程&#xff0c;这有助于避免冻结户端界面&#xff0c; 异步操作还可以增加 Web 应用程序的吞吐量&#xff0c;可以在数据库操作完成前释放线程去处理其他请求。EF …

java 进程同步代码_java 实现进程间的同步(源代码)

操作系统课程设计&#xff1a;实现进程间的同步。 有问题留言import java.util.concurrent.Semaphore; /******** 信号量 *******/ class Sign { final static int NUMS 6; // 进程的数目 final static int RUN 1; // 运行完 final static int STOP 0; // 阻塞态 static int…

CSS日常公用样式与一些解决方案

一、自己总结的公用样式解析html, body, div, p, ul, li, dl, dt, dd, h1, h2, h3, h4, h5, h6, form, input, select, button, textarea, iframe, table, th, td { margin: 0; padding: 0; }img { border: 0 none; vertical-align: top; }ul, li { list-style-type: none; }h1…