ThreadLocal应用与原理分析
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应用与原理分析相关推荐
- ThreadLocal的使用及原理分析
文章简介 ThreadLocal应该都比较熟悉,这篇文章会基于ThreadLocal的应用以及实现原理做一个全面的分析 内容导航 什么是ThreadLocal ThreadLocal的使用 分析Thr ...
- java thread 内存泄露_Java ThreadLocal 内存泄露问题分析及解决方法。
前言 在分析ThreadLocal导致的内存泄露前,需要普及了解一下内存泄露.强引用与弱引用以及GC回收机制,这样才能更好的分析为什么ThreadLocal会导致内存泄露呢?更重要的是知道该如何避免这 ...
- Handler原理分析
Handler的原理分析这个标题,很多文章都写过,最近认真将源码逐行一字一句研究,特此也简单总结一遍. 首先是Handler整个Android消息机制的简单概括: 分三部分对消息机制的整个流程进行阐述 ...
- Android--Handler使用应运及消息机制处理原理分析
最近开通了一个小微博,欢迎大家关注,每天分享一些上班路上看的小知识点 点击打开链接 一.Handler是什么 ? handler是android给我们提供的一套用来更新UI的一套机制,也是一套消息处理 ...
- Netty技术细节源码分析-Recycler对象池原理分析
本文是该篇的修正版 本文的github地址:点此 该文所涉及的netty源码版本为4.1.6. Netty的对象池Recycler是什么 Recycler是Netty中基于ThreadLocal的轻量 ...
- Java8 并行流(parallelStream)原理分析及注意事项
文章目录 前言 一.parallelStream是什么 二.parallelStream原理分析 1.Fork/Join框架 1.1 work-stealing(工作窃取算法) 1.2 常用方法 2. ...
- MyBatis原理分析(通俗易懂)
MyBatis原理分析 MyBatis工作流程简述 原生MyBatis原理分析 初始化工作 解析配置文件 配置类方式 执行SQL SqlSession API方式 接口方式 真正掌握一个框架源码分析是 ...
- CGLIB 动态代理及其原理分析
一.简介 CGLIB,即 Code Generation Library,是一个强大的.高性能的代码生成库.它可以在运行期扩展 Java 类与实现 Java 接口(JDK 动态代理只能用于接口), ...
- Feign调用原理分析
Feign调用原理分析 Feign调用原理分析 问题 Feign调用原理分析 调用之前:进行构造请求体.(构造方式为,配置的请求拦截器) 请求方式,请求地址,请求头等等 问题 Feign远程调用,缺失 ...
最新文章
- C++面试知识点总结
- Neuron 2020 | 深度强化学习和神经科学
- php获取域名与路径
- OC与c混编实现Java的String的hashcode()函数
- 141. Sqrt(x)【牛顿迭代法求平方根 by java】
- 服务器操作系统百度文库,Linux操作系统配置服务器的方法及实现_百度文库(6页)-原创力文档...
- 136个Python 机器学习知识点让你受益终生!
- 面向对象课程 - 寒假第三次作业 - C++计算器项目初始部分
- 华为首批升级鸿蒙系统的手机,鸿蒙系统首批升级机型曝光!荣耀手机遗憾缺席,原因很简单...
- 日本老年人开始送外卖了 锻炼赚钱两不误 网友:饿死了么外卖?
- 机器学习实战 梯度上升 数学推导_机器学习全路线经典书籍
- 苹果回应iPhone邮件漏洞;GitHub连续3天爆严重宕机情况;腾讯开源Transformer推理加速工具| 极客头条...
- 单片机跑马灯代码示例
- TLSF 内存分配算法详解
- 第九节 html特殊文字符号
- grub4dos挂载iso linux,GRUB4DOS加载ISO启动光盘完美解决方案
- 科技论文计算机排版格式,科技论文排版参考格式
- 华为笔记本都是Linux版本,华为笔记本装上linux系统而非Windows系统 这是为何
- 一篇论文的正确格式是什么?
- FZU2132 - LQX的作业(概率论)
热门文章
- TypeError系列之:TypeError: 'tuple' object is not callable.
- android动态32位so,Android:动态库(.so)调试技巧
- 死锁问题案例分析解决
- 主存储器与CPU的连接
- 排序算法——单链表快速排序(划分函数从一边划分)
- UML 中关系详解以及在visio中的表示
- 数据挖掘十大算法之—C4.5
- Changing the sharing of a project
- Eclipse中如何恢复已删除文件
- 说说你对http、https、http2.0的理解【前端每日一题-25】