多线程-ThreadLocal,InheritableThreadLocal
ThreadLocal
变量值得共享可以使用public static变量的形式,所有的线程都使用同一个public static变量。如果想实现每一个线程都有自己的共享变量该如何解决呢?JDK中提供的ThreadLocal正是解决这样的问题。
ThreadLocal主要解决的就是每个线程绑定自己的值,可以将ThreadLocal类比喻成全局存放数据的盒子,盒子中可以存储每个线程的私有数据。ThreadLocal解决的是变量在不同线程键的隔离性,也就是不同 线程拥有自己的值,不同线程中的值是可以放入ThreadLocal类中进行保存的。
package org.github.lujiango;public class Test03 {public static ThreadLocal<Object> tl = new ThreadLocal<Object>();static class ThreadA extends Thread {@Overridepublic void run() {try {tl.set("ThreadA");Thread.sleep(200);System.out.println("ThreadA get value = " + tl.get());} catch (Exception e) {e.printStackTrace();}}}static class ThreadB extends Thread {@Overridepublic void run() {try {tl.set("ThreadB");Thread.sleep(200);System.out.println("ThreadB get value = " + tl.get());} catch (Exception e) {e.printStackTrace();}}}public static void main(String[] args) {try {ThreadA a = new ThreadA();ThreadB b = new ThreadB();a.start();b.start();} catch (Exception e) {e.printStackTrace();}}}
第一次调用ThreadLocal类的get()方法返回值是null,可以自定义protected T initialValue()方法,设置默认值。
package org.github.lujiango;class ThreadLocalExt extends ThreadLocal<String> {@Overrideprotected String initialValue() {return "defalut";}
}public class Test03 {public static ThreadLocalExt tl = new ThreadLocalExt();static class ThreadA extends Thread {@Overridepublic void run() {try {System.out.println("ThreadA get value = " + tl.get());tl.set("ThreadA");Thread.sleep(200);System.out.println("ThreadA get value = " + tl.get());} catch (Exception e) {e.printStackTrace();}}}static class ThreadB extends Thread {@Overridepublic void run() {try {System.out.println("ThreadB get value = " + tl.get());tl.set("ThreadB");Thread.sleep(200);System.out.println("ThreadB get value = " + tl.get());} catch (Exception e) {e.printStackTrace();}}}public static void main(String[] args) {try {ThreadA a = new ThreadA();ThreadB b = new ThreadB();a.start();b.start();} catch (Exception e) {e.printStackTrace();}}}
InheritableThreadLocal
InheritableThreadLocal可以在子线程中取得父线程继承下来的值,即可以让子线程从父进程中取得值。
package org.github.lujiango;public class Test04 {static InheritableThreadLocal<String> itl = new InheritableThreadLocal<String>();static class ThreadA extends Thread {@Overridepublic void run() {try {System.out.println("ThreadA get: " + itl.get());} catch (Exception e) {e.printStackTrace();}}}public static void main(String[] args) {try {itl.set("Main");Thread.sleep(1000);ThreadA a = new ThreadA();a.start();} catch (Exception e) {e.printStackTrace();}}}
InheritableThreadLocal即可以设置默认值,也可以在继承父线程值的同时修改。
package org.github.lujiango;class InheritableThreadLocalExt extends InheritableThreadLocal<String> {@Overrideprotected String initialValue() {return "defalut";}@Overrideprotected String childValue(String parentValue) {return parentValue + " child";}
}public class Test04 {static InheritableThreadLocalExt itl = new InheritableThreadLocalExt();static class ThreadA extends Thread {@Overridepublic void run() {try {Thread.sleep(1000);System.out.println("ThreadA get: " + itl.get());} catch (Exception e) {e.printStackTrace();}}}public static void main(String[] args) {try {System.out.println(itl.get());itl.set("Main1");Thread.sleep(1000);ThreadA a = new ThreadA();a.start();itl.set("Main2");System.out.println(itl.get());} catch (Exception e) {e.printStackTrace();}}}
注:如果子线程在取得值得同时,主线程将InheritableThreadLocal中的值进行更改,那么子线程取到的值还是旧值。
转载于:https://www.cnblogs.com/lujiango/p/7580790.html
多线程-ThreadLocal,InheritableThreadLocal相关推荐
- JUC第六讲:ThreadLocal/InheritableThreadLocal详解/TTL-MDC日志上下文实践
本文是JUC第六讲:ThreadLocal/InheritableThreadLocal详解.ThreadLocal无论在项目开发还是面试中都会经常碰到,本文就 ThreadLocal 的使用.主要方 ...
- Java 多线程:InheritableThreadLocal 实现原理
前言 介绍 InheritableThreadLocal 之前,假设对 ThreadLocal 已经有了一定的理解,比如基本概念,原理,如果没有,可以参考:Java 多线程:threadlocal关键 ...
- 多线程-- ThreadLocal
ThreadLocal是什么? 早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁 ...
- Java 多线程 —— ThreadLocal
一.引言 ThreadLocal是Java帮助实现线程封闭性的典型手段. 作用:提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或组件之间一些公共变量的传递复杂度.同时 ...
- Java多线程——ThreadLocal
如果需要在多个线程之间共享资源,达到线程之间的通信可以使用同步机制:如果需要隔离多个线程之间的共享冲突,可以使用ThreadLocal. public class ThreadLocal<T&g ...
- 多线程 threadlocal 获取经办人信息
解决hash冲突: 在java线程中,每个线程都有一个ThreadLocalMap实例变量(如果不使用ThreadLocal,不会创建这个Map,一个线程第一次访问某个ThreadLocal变量时,才 ...
- 【Java多线程】高级主题:定时调度、quartz、指令重排、volatile、ThreadLocal
定时调度 1000ms后执行 每隔500ms执行一次 package cn.hanquan.test;import java.util.Timer; import java.util.TimerTas ...
- InheritableThreadLocal类原理简介使用 父子线程传递数据详解 多线程中篇(十八)...
上一篇文章中对ThreadLocal进行了详尽的介绍,另外还有一个类: InheritableThreadLocal 他是ThreadLocal的子类,那么这个类又有什么作用呢? 测试代码 publi ...
- 【高并发】ThreadLocal、InheritableThreadLocal
文章目录 1.概述 2.需要解决的问题 ThreadLocal InheritableThreadLocal 1.概述 转载:添加链接描述 2.需要解决的问题 我们还是以解决问题的方式来引出Threa ...
最新文章
- Python每日一练0023
- vue 页面闪烁的问题_vue页面加载闪烁问题的解决方法
- 对Android源码分析总结(Z)
- JS window对象 Location对象 location用于获取或设置窗体的URL,并且可以用于解析URL。 语法: location.[属性|方法]...
- 人工智能在线特征系统中的数据存取技术
- 【百度地图API】如何批量转换为百度经纬度
- 学会这个绝招,让 C++ 崩溃无处可逃!
- 学会这 6 招,网页搜索一秒就能搜到你想要的【老司机必备神技】
- 剑指offer python版 剪绳子
- QQ钱包的接入及其设计分析
- 【OKR案例合集】产品、研发、设计岗位的OKR案例合集
- Axure 9 编辑窗口中的负坐标空间
- php七牛云,php七牛云
- c语言比php好学吗,php和c语言哪个难
- 【在线教育-PC+手机-源代码】HDEDU在线网校系统–学习+练习+考试+支付+营销一站式!在线网校系统 学习练习考试 支付营销
- 将多个文件夹下内容合并到一个文件夹下
- 什么是软件测试?软件测试的目的和流程是什么?——入门软件测试
- Unable to use EPCS device Leaving target processor paused
- .NET网站发布常见问题解决方案
- abaqus生成odb文件_【前沿技术】基于Python的ABAQUS二次开发在飞机蒙皮锤铆中的应用...