ThreadLocal的作用

ThreadLocal类用来提供线程内部的局部变量,并且这些变量依靠线程独立存在.可以在多个线程中互不干扰的进行存储数据和修改数据,通过set,get 和remove方法, 每个线程都是独立的操作.ThreadLocal试图解决的问题是:在线程生命周期内,在任何运行时刻可以方便的访问一些数据,而不是依靠参数传递的方式。ThreadLocal只能存储一个变量

ThreadLocal如何使用

ThreadLocal使用比较简单,在线程启动或者任何开始处理业务是调用set(T t)方法,将变量存储在线程空间中,往后再任何需要使用的地方可以使用get()方法获取到前面set的变量,最后在完成使用时调用remove()清除变量

import java.util.Scanner;
import java.util.concurrent.Executors;public class Main {public static void main(String[] args) throws InterruptedException {myThread t1=new myThread(false);myThread t2=new myThread(true);t1.setName("Thread1");t2.setName("Thread2");t1.start();t2.start();t1.join();t2.join();}}
class myThread extends Thread {private ThreadLocal<String> local=new ThreadLocal<String>(){@Overrideprotected String initialValue() {// TODO Auto-generated method stubreturn "threadLocal的初始化";}};private boolean read=false;public myThread(boolean read){this.read=read;}public void run(){if(read==false){local.set(Thread.currentThread().getName()+"local");System.out.println(local.get());}else  {System.out.println(local.get());}}
}

运行结果

result》》》》》》》》
Thread1local
threadLocal的初始化
public class Calculator {ThreadLocal<String> local = new ThreadLocal<>();public int add(int a, int b) {return a + b;}public int sub(int a, int b) {return a - b;}public static void main(String[] args) {Calculator c = new Calculator();c.local.set("1");c.local.set("2");System.out.println(c.local.get());System.out.println(c.local.get());}
}

运行结果:
2
2

原理分析:



Thread类在init时并没有ThreadLocal.ThreadLocalMap threadLocals = null;

在ThreadLocal中设置变量

  • 1、根据Thread的native方法获得jvm当前正在运行的线程
  • 2、获取当前线程的threadLocals成员变量,对象类型为ThreadLocal.ThreadLocalMap
  • 3、如果ThreadLocalMap对象为空,则调用createMap(Thread t, T firstValue)创建ThreadLocal.ThreadLocalMap对象实例,并赋值给当前线程的成员变量threadLocals
  • 4、如果对象不为空,则将T t设置到当前线程的ThreadLocalMap对象threadLocals中。

在ThreadLocal中获取变量




  • 1、获取当前线程绑定的ThreadLocalMap对象
  • 2、如果当前线程绑定的ThreadLocalMap对象为空,则初始化绑定的ThreadLocalMap对象,并设置null值,返回null
  • 3、如果ThreadLocalMap对象不为空,则根据当前的ThreadLocal对象在ThreadLocalMap中的 Entry[] table 中获取对应的Entry
  • 4、返回Entry中的value

删除ThreadLocal中获取变量

ThreadLocal进阶

ThreadLocal应用与原理分析相关推荐

  1. ThreadLocal的使用及原理分析

    文章简介 ThreadLocal应该都比较熟悉,这篇文章会基于ThreadLocal的应用以及实现原理做一个全面的分析 内容导航 什么是ThreadLocal ThreadLocal的使用 分析Thr ...

  2. java thread 内存泄露_Java ThreadLocal 内存泄露问题分析及解决方法。

    前言 在分析ThreadLocal导致的内存泄露前,需要普及了解一下内存泄露.强引用与弱引用以及GC回收机制,这样才能更好的分析为什么ThreadLocal会导致内存泄露呢?更重要的是知道该如何避免这 ...

  3. Handler原理分析

    Handler的原理分析这个标题,很多文章都写过,最近认真将源码逐行一字一句研究,特此也简单总结一遍. 首先是Handler整个Android消息机制的简单概括: 分三部分对消息机制的整个流程进行阐述 ...

  4. Android--Handler使用应运及消息机制处理原理分析

    最近开通了一个小微博,欢迎大家关注,每天分享一些上班路上看的小知识点 点击打开链接 一.Handler是什么 ? handler是android给我们提供的一套用来更新UI的一套机制,也是一套消息处理 ...

  5. Netty技术细节源码分析-Recycler对象池原理分析

    本文是该篇的修正版 本文的github地址:点此 该文所涉及的netty源码版本为4.1.6. Netty的对象池Recycler是什么 Recycler是Netty中基于ThreadLocal的轻量 ...

  6. Java8 并行流(parallelStream)原理分析及注意事项

    文章目录 前言 一.parallelStream是什么 二.parallelStream原理分析 1.Fork/Join框架 1.1 work-stealing(工作窃取算法) 1.2 常用方法 2. ...

  7. MyBatis原理分析(通俗易懂)

    MyBatis原理分析 MyBatis工作流程简述 原生MyBatis原理分析 初始化工作 解析配置文件 配置类方式 执行SQL SqlSession API方式 接口方式 真正掌握一个框架源码分析是 ...

  8. CGLIB 动态代理及其原理分析

    一.简介   CGLIB,即 Code Generation Library,是一个强大的.高性能的代码生成库.它可以在运行期扩展 Java 类与实现 Java 接口(JDK 动态代理只能用于接口), ...

  9. Feign调用原理分析

    Feign调用原理分析 Feign调用原理分析 问题 Feign调用原理分析 调用之前:进行构造请求体.(构造方式为,配置的请求拦截器) 请求方式,请求地址,请求头等等 问题 Feign远程调用,缺失 ...

最新文章

  1. C++面试知识点总结
  2. Neuron 2020 | 深度强化学习和神经科学
  3. php获取域名与路径
  4. OC与c混编实现Java的String的hashcode()函数
  5. 141. Sqrt(x)【牛顿迭代法求平方根 by java】
  6. 服务器操作系统百度文库,Linux操作系统配置服务器的方法及实现_百度文库(6页)-原创力文档...
  7. 136个Python 机器学习知识点让你受益终生!
  8. 面向对象课程 - 寒假第三次作业 - C++计算器项目初始部分
  9. 华为首批升级鸿蒙系统的手机,鸿蒙系统首批升级机型曝光!荣耀手机遗憾缺席,原因很简单...
  10. 日本老年人开始送外卖了 锻炼赚钱两不误 网友:饿死了么外卖?
  11. 机器学习实战 梯度上升 数学推导_机器学习全路线经典书籍
  12. 苹果回应iPhone邮件漏洞;GitHub连续3天爆严重宕机情况;腾讯开源Transformer推理加速工具| 极客头条...
  13. 单片机跑马灯代码示例
  14. TLSF 内存分配算法详解
  15. 第九节 html特殊文字符号
  16. grub4dos挂载iso linux,GRUB4DOS加载ISO启动光盘完美解决方案
  17. 科技论文计算机排版格式,科技论文排版参考格式
  18. 华为笔记本都是Linux版本,华为笔记本装上linux系统而非Windows系统 这是为何
  19. 一篇论文的正确格式是什么?
  20. FZU2132 - LQX的作业(概率论)

热门文章

  1. TypeError系列之:TypeError: 'tuple' object is not callable.
  2. android动态32位so,Android:动态库(.so)调试技巧
  3. 死锁问题案例分析解决
  4. 主存储器与CPU的连接
  5. 排序算法——单链表快速排序(划分函数从一边划分)
  6. UML 中关系详解以及在visio中的表示
  7. 数据挖掘十大算法之—C4.5
  8. Changing the sharing of a project
  9. Eclipse中如何恢复已删除文件
  10. 说说你对http、https、http2.0的理解【前端每日一题-25】