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相关推荐

  1. JUC第六讲:ThreadLocal/InheritableThreadLocal详解/TTL-MDC日志上下文实践

    本文是JUC第六讲:ThreadLocal/InheritableThreadLocal详解.ThreadLocal无论在项目开发还是面试中都会经常碰到,本文就 ThreadLocal 的使用.主要方 ...

  2. Java 多线程:InheritableThreadLocal 实现原理

    前言 介绍 InheritableThreadLocal 之前,假设对 ThreadLocal 已经有了一定的理解,比如基本概念,原理,如果没有,可以参考:Java 多线程:threadlocal关键 ...

  3. 多线程-- ThreadLocal

    ThreadLocal是什么? 早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁 ...

  4. Java 多线程 —— ThreadLocal

    一.引言 ThreadLocal是Java帮助实现线程封闭性的典型手段. 作用:提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或组件之间一些公共变量的传递复杂度.同时 ...

  5. Java多线程——ThreadLocal

    如果需要在多个线程之间共享资源,达到线程之间的通信可以使用同步机制:如果需要隔离多个线程之间的共享冲突,可以使用ThreadLocal. public class ThreadLocal<T&g ...

  6. 多线程 threadlocal 获取经办人信息

    解决hash冲突: 在java线程中,每个线程都有一个ThreadLocalMap实例变量(如果不使用ThreadLocal,不会创建这个Map,一个线程第一次访问某个ThreadLocal变量时,才 ...

  7. 【Java多线程】高级主题:定时调度、quartz、指令重排、volatile、ThreadLocal

    定时调度 1000ms后执行 每隔500ms执行一次 package cn.hanquan.test;import java.util.Timer; import java.util.TimerTas ...

  8. InheritableThreadLocal类原理简介使用 父子线程传递数据详解 多线程中篇(十八)...

    上一篇文章中对ThreadLocal进行了详尽的介绍,另外还有一个类: InheritableThreadLocal 他是ThreadLocal的子类,那么这个类又有什么作用呢? 测试代码 publi ...

  9. 【高并发】ThreadLocal、InheritableThreadLocal

    文章目录 1.概述 2.需要解决的问题 ThreadLocal InheritableThreadLocal 1.概述 转载:添加链接描述 2.需要解决的问题 我们还是以解决问题的方式来引出Threa ...

最新文章

  1. Python每日一练0023
  2. vue 页面闪烁的问题_vue页面加载闪烁问题的解决方法
  3. 对Android源码分析总结(Z)
  4. JS window对象 Location对象 location用于获取或设置窗体的URL,并且可以用于解析URL。 语法: location.[属性|方法]...
  5. 人工智能在线特征系统中的数据存取技术
  6. 【百度地图API】如何批量转换为百度经纬度
  7. 学会这个绝招,让 C++ 崩溃无处可逃!
  8. 学会这 6 招,网页搜索一秒就能搜到你想要的【老司机必备神技】
  9. 剑指offer python版 剪绳子
  10. QQ钱包的接入及其设计分析
  11. 【OKR案例合集】产品、研发、设计岗位的OKR案例合集
  12. Axure 9 编辑窗口中的负坐标空间
  13. php七牛云,php七牛云
  14. c语言比php好学吗,php和c语言哪个难
  15. 【在线教育-PC+手机-源代码】HDEDU在线网校系统–学习+练习+考试+支付+营销一站式!在线网校系统 学习练习考试 支付营销
  16. 将多个文件夹下内容合并到一个文件夹下
  17. 什么是软件测试?软件测试的目的和流程是什么?——入门软件测试
  18. Unable to use EPCS device Leaving target processor paused
  19. .NET网站发布常见问题解决方案
  20. abaqus生成odb文件_【前沿技术】基于Python的ABAQUS二次开发在飞机蒙皮锤铆中的应用...

热门文章

  1. 苹果cms v8模板 高仿爱奇艺带PC+手机模板
  2. rtklib 天线相位中心_发射天线的作用
  3. LeetCode | 我的LeetCode之旅(持续更新ing)
  4. 临时停车码-扫码拨号发信息HTML源码
  5. 找call的万能方法,一招通杀所有网络游戏【个人实践出来的】
  6. 草根教程 网友详解索尼本本装雪豹过程
  7. 统计学习方法-李航(5)
  8. prim——最小连接路径和(hdu1301)
  9. Java—System类和Runtime类
  10. 数组算法 中部删除数据 1202