首页 > 其他分享 >ThreadLocal原理

ThreadLocal原理

时间:2023-12-13 16:37:26浏览次数:31  
标签:Thread ThreadLocalMap 绑定 remove ThreadLocal 线程 原理

ThreadLocal主要起到线程隔离作用,使得每个线程拥有自己独立的一份数据,经过threadLocal处理的数据是线程独享的,不与其它线程分享或者干扰,因此能起到线程之间数据隔离的作用。

ThreadLocal的几个核心方法:

方法声明描述
public void set(T value) 设置当前线程绑定的局部变量
public T get() 获取当前线程绑定的局部变量
Public void remove() 移除当前线程绑定的局部变量

1:set()方法
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null) {
map.set(this, value);
} else {
createMap(t, value);
}
}

该方法首先获取当前线程,并获取当前线程下维护的ThreadLocalMap元素并将数据存入到ThreadLocalMap,其中key为ThreadLocal对象本身,value就是我们想要存入的数据。

(如果没有ThreadLocalMap,就生成一个ThreadLocalMap对象,并将其与当前线程绑定,这样就是说每个线程维护了一份属于自己的ThreadLocalMap,使用的时候将数据保存在ThreadLocalMap中,这就是为什么ThreadLocal能够做到线程之间数据隔离的原因。本质就是因为每个线程通过ThreadLocal维护了一份属于自己的ThreadLocalMap)

2:get()方法

 

public T get() {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null) {
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null) {
@SuppressWarnings("unchecked")
T result = (T)e.value;
return result;
}
}
return setInitialValue();
}

 

获取当前线程绑定的ThreadLocalMap元素,并获取其中的数据。(key为ThreadLocal对象本身)

3:remove()方法

 

public void remove() {
ThreadLocalMap m = getMap(Thread.currentThread());
if (m != null) {
m.remove(this);
}
}

 

获取当前线程绑定的ThreadLocalMap,将数据remove掉。(key为ThreadLocal对象本身)

本质:ThreadLocal是一个工具类,Thread类下维护了一个threadlocals变量,ThreadLocal将ThreadLocalMap赋值给Thread类下维护了一个threadlocals,从而实现了线程与ThreadLocalMap的绑定。每个线程独自拥有一个属于自己的ThreadLocalMap,进而实现了线程之间的数据隔离。

需要注意的是在数据使用完毕后,不要忘了调用remove方法,清除数据。

若依框架下ThreadLocal使用的例子:

 

 

 

 

 


 

标签:Thread,ThreadLocalMap,绑定,remove,ThreadLocal,线程,原理
From: https://www.cnblogs.com/andy1234/p/17899331.html

相关文章

  • 理解Mysql索引原理及特性
    作为开发人员,碰到了执行时间较长的sql时,基本上大家都会说”加个索引吧”。但是索引是什么东西,索引有哪些特性,下面和大家简单讨论一下。1索引如何工作,是如何加快查询速度索引就好比书本的目录,提高数据库表数据访问速度的数据库对象。当我们的请求打过来之后,如果有目录,就会快速的......
  • 视频流的含义、定义及其工作原理分析
    流媒体是一种通过互联网传输,将音频、视频等多媒体内容从存储设备传输到另一个设备的技术。与传统下载方式不同,流媒体可以实现边下边播,用户无需等待完整文件下载即可开始观看,同时具有流畅体验。流媒体的优点在于方便快捷,用户只需要网络连接和播放设备就能随时随地观看或听取所需内......
  • 从根上理解elasticsearch(lucene)查询原理(2)-lucene常见查询类型原理分析
    大家好,我是蓝胖子,在上一节我提到要想彻底搞懂elasticsearch慢查询的原因,必须搞懂lucene的查询原理,所以在上一节我分析了lucene查询的整体流程,除此以外,还必须要搞懂各种查询类型内部是如何工作,比如比较复杂的查询是将一个大查询分解成了小查询,然后通过对小查询的结果进行合并得到......
  • Istio从入门到精通—— 流量治理的原理 —— VirutalService —— HTTPMatchRequest
    流量治理的原理——VirutalService——HTTPMatchRequestHttpMatchRequestspecifiesasetofcriteriontobemetinorderfortheruletobeappliedtotheHTTPrequest.Forexample,thefollowingrestrictstheruletomatchonlyrequestswheretheURLpaths......
  • SAP ABAP 显式增强技术之 New BAdI 的技术原理介绍试读版
    本教程之前的文章,对SAPABAP各种增强技术做了一个概述:122.SAPABAP各种增强技术(Enhancement)概述-所谓第一代,第二代,第三代增强技术的出处是?然后第62篇文章,针对下图红色区域的基于EnhancementFramework增强技术中的隐式增强之ABAP报表增强,做了详细介绍:62.如何通过增......
  • 硬件开发笔记(十六):RK3568底板电路mipi摄像头接口原理图分析、mipi摄像头详解
    前言  本篇继续分析底板原理图mipi电路原理图、mipi摄像头输入硬件接口详解。<br>RK3568芯片摄像头接口  查看RK3568的芯片手册,摄像头接口并不支持直接sensor模拟信号输入,只能接收mipi信号,RK3568的摄像头接口引脚如下:    只支持mipi的数字信号摄像头。  本来计划......
  • 硬件开发笔记(十六):RK3568底板电路mipi摄像头接口原理图分析、mipi摄像头详解
    前言  本篇继续分析底板原理图mipi电路原理图、mipi摄像头输入硬件接口详解。 RK3568芯片摄像头接口  查看RK3568的芯片手册,摄像头接口并不支持直接sensor模拟信号输入,只能接收mipi信号,RK3568的摄像头接口引脚如下:    只支持mipi的数字信号摄像头。  本......
  • 火星探测器背后的人工智能:从原理到实战的强化学习
    本文详细探讨了强化学习在火星探测器任务中的应用。从基础概念到模型设计,再到实战代码演示,我们深入分析了任务需求、环境模型构建及算法实现,提供了一个全面的强化学习案例解析,旨在推动人工智能技术在太空探索中的应用。关注TechLead,分享AI全维度知识。作者拥有10+年互联网服务......
  • Istio从入门到精通—— 流量治理的原理 —— VirutalService —— Headers
    流量治理的原理——VirutalService——Headershttps://istio.io/latest/docs/reference/config/networking/virtual-service/#Headers MessageheaderscanbemanipulatedwhenEnvoyforwardsrequeststo,orresponsesfrom,adestinationservice.Headermani......
  • Unity3D帧同步的原理以及项目开发中可能遇到的问题与解决方案
    一、Unity3D帧同步的原理帧同步是指将游戏中的每一帧的状态数据同步给所有的客户端,使得所有客户端的游戏画面都保持一致。在Unity3D中,帧同步一般分为两种模式:客户端模式和服务器模式。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开......