ThreadLocal学习02-ThreadLocal原理

加强版ThreadLocal之阿里开源TransmittableThreadLocal学习 我们都知道ThreadLocal是可以在一个线程中当容器使用的局部变量,是线程隔离、线程安全的。 但是如果子线程要获取父线程的变量,便不太方便。 下面我们一步一步进入: 一、ThreadLocal 示例: public class MyThread01 { public static void main(String[] args) throws InterruptedException { ThreadLocal<String> parent = new 阅读详情

1、set()方法:


    public void set(T value) {
//获取当前线程
        Thread t = Thread.currentThread();
//得到当前线程的ThreadLocalMap
        ThreadLocalMap map = getMap(t);
        if (map != null)//存在赋值
            map.set(this, value);
        else//不存在创建
            createMap(t, value);
    }
//返回当前线程的ThreadLocalMap
   ThreadLocalMap getMap(Thread t) {
        return t.threadLocals;
    }

    void createMap(Thread t, T firstValue) {
        t.threadLocals = new ThreadLocalMap(this, firstValue);
    }

从代码中可以看到ThreadLocalMap是线程Thread的一个属性。ThreadLocalMap类似于map,保证key的唯一性,key就是ThreadLocal得hash值,所以同一个线程多次set值会覆盖前面得值。

2、get()方法

    public T get() {
//获取当前线程
        Thread t = Thread.currentThread();
//获取线程得ThreadLocalMap属性
        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;
            }
        }
//如果没有set值,第一次查询得时候获取默认初始化值
        return setInitialValue();
    }

//给ThreadLocal赋初始值
    private T setInitialValue() {
        T value = initialValue();
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
        return value;
    }

ThreadLocal得初始值是null,可以根据一下方法修改初始值:

//通过静态方法获取有初始值得threadlocal的子类
    public static <S> ThreadLocal<S> withInitial(Supplier<? extends S> supplier) {
        return new SuppliedThreadLocal<>(supplier);
    }

//子类
    static final class SuppliedThreadLocal<T> extends ThreadLocal<T> {

        private final Supplier<? extends T> supplier;

        SuppliedThreadLocal(Supplier<? extends T> supplier) {
            this.supplier = Objects.requireNonNull(supplier);
        }

        @Override
        protected T initialValue() {
            return supplier.get();
        }
    }

3、内存泄漏

可以看看这条知乎:https://zhuanlan.zhihu.com/p/102571059

Video Diffusion Models:基于扩散模型的视频生成 Diffusion Models专栏文章汇总:入门与实战 前言:扩散模型已经被广泛运用到图像生成、image-to-image转换、时间序列生成、3D点云生成、文本生成、音频生成等领域,谷歌研究院最新的研究成果成功将diffusion models运用到视频生成领域。 目录 模型结构 分解时空体系联合训练 梯度条件法 恐怖的实验结果 论文和代码 个人启发 个人疑问? 模型结构 在前面的博文中,我详细介绍了为什么绝大部分的diffusion models都使用Unet结构. 阅读详情

相关推荐

基于51单片机的多功能智能路灯控制系统(仿真+代码+原理图)

智能路灯控制系统主要由51单片机最小系统+1602显示模块+DS1302时钟模块+光强检测模块+按键输入模块+声光报警模块+LED照明模块+状态检测电路+人体车辆红外检测模块组成。能实现以下功能: 1.能够按键设定系统时间、工作时间、光照阈值 2.工作时间内路灯点亮,凌晨12点后路灯关闭,有人或车通过是,路灯点亮10s 3.非工作时间光照强度低于阈值,路灯点亮 4.能够检测系统工作状态,路灯应亮未亮,声光报警 5.具备手动控制,能够切换自动/手动控制功能

u012759563的博客 8180

为什么Java ThreadLocal变量是静态的而不会混淆

为什么Java ThreadLocal变量是静态的而不会混淆

KissTooTrue的博客 780

CLIP-Count代码配置以及踩坑记录

CLIP-Count代码配置以及踩坑记录

学术菜鸡 1011

ThreadLocal 与 static 变量

参考文章:ThreadLocal 与static变量 ThreadLocal是为解决多线程程序的并发问题而提出的,可以称之为线程局部变量。与一般的变量的区别在于,生命周期是在线程范围内的。 static变量是的生命周期与类的使用周期相同,即只要类存在,那么static变量也就存在。 那么一个 static 的 ThreadLocal会是什么样的呢? 看下面一个例子, publicclassSequenceNumber{ privatestaticThreadLocal<Inte...

justlpf的专栏 4255

保姆级教程:在ROS2 Humble上搞定Livox Mid-360雷达,从IP配置到Rviz点云显示

本文提供在ROS2 Humble上配置Livox Mid-360激光雷达的完整教程,涵盖从IP设置到Rviz点云显示的全流程。详细解析硬件连接、驱动编译、配置文件优化及常见问题排查,帮助开发者快速搭建开发环境并实现高效点云可视化。

weixin_30955617的博客 184

手撕Lua字节码:从黑盒到透明

lua 字节码 怎么‘手撕’一个 chunk 看看里面啥样?我手里有一个.luac或出来的二进制字节码,想知道里面到底是什么结构、哪些字段、有哪些指令,怎么一步一步“拆箱”,从一个黑盒变成有迹可循的东西?也就是:不满足于只会loadpcall而是想亲眼看看一个 chunk 内部长啥样,甚至写点工具把它解析出来。这篇就用带你从“拿到一坨.luac不搞高深玄学,尽量让你看完就能自己动手。注:以 Lua 5.3/5.4 为主,细节各版本略有不同,但大体套路是一致的。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 101

【Java】ThreadLocal 详解

ThreadLocal Thread ThreadLocalMap 这三者的关系是怎么样的?

Prior_SX的博客 1103

足式机器人全身 MPPI: 利用 MPPI 对足式机器人进行实时全身控制

本研究首次在真实四足机器人上成功部署了基于全身采样的模型预测控制(MPC)系统。采用模型预测路径积分(MPPI)算法,通过并行采样和评估控制轨迹实现实时运动规划。该系统能处理复杂接触场景,完成推箱子、爬越障碍及崎岖地形行走等任务。实验使用Unitree Go1机器人,结合MuJoCo仿真器快速生成运动策略,仅需简单控制策略即可实现稳健操作。硬件验证表明,该方法能有效完成目标导向的箱子推动任务。该成果标志着采样MPC在足式机器人实际应用中的重要突破。

2506_90492529的博客 1000

ThreadLocal的使用方法

ThreadLocal的含义是Thread Local Variable,它可以声明一个字段,使得不同的线程访问这个字段时,获取的都是不同的副本,互不影响。 ThreadLocal的作用和在每个Thread类声明一个字段相同,那么什么时候使用它呢?还是在编写一些框架时,因为这时你无法预先定义Thread类。其中一个典型的用法是调用一个静态方法,这个静态方法会操作一个ThreadLocal变量

No.⑩號²º¹4 1021

华为od 面试八股文_JAVA语言_01_含答案

华为od 面试八股文_JAVA语言_01_含答案

MISAYAONE的博客 4315

AES加密算法及AES-CMAC原理白话版系统解析

对AES不同加密算法,加密模式,加密原理,填充算法及AES-CMAC算法的详细系统介绍,帮助大家对AES进行系统掌握。

initiallizer的博客 4074

【ThreadLocal 】史上最全ThreadLocal 详解(一),简介,与Synchronized的区别,原理,set,get,remove,ThreadLocalMap,使用场景

【ThreadLocal 】史上最全ThreadLocal 详解(一),简介,与Synchronized的区别,原理,set,get,remove,ThreadLocalMap,使用场景

qq120631157的博客 1542

【WRF-Chem教程-附录 C】闪电-NOx 参数化方案详解

闪电-NOx 参数化方案详解

WW、forever的博客 974

ThreadLocal原理详解——终于弄明白了ThreadLocal

目录 概述 API介绍 ThreadLocal的理解 ThreadLocal的原理分析 总结 概述 在java学习生涯中可能很多人都会听到ThreadLocal变量,从字面上理解ThreadLocal就是“线程局部变量”的意思。简单的说就是,一个ThreadLocal在一个线程中是共享的,在不同线程之间又是隔离的(每个线程都只能看到自己线程的值)。可能一开始把这句话放出来很难理解,那...

听得到微笑的博客 2万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

ThreadLocal原理详解--终于弄明白了ThreadLocal

ThreadLocal原理详解 在我看到ThreadLocal这个关键字的时候我是懵逼的,我觉得我需要弄明白,于是,我就利用搜索引擎疯狂查找,试图找到相关的解答,但是结果不尽人意。 首先说一下我的理解和感悟: ①什么是ThreadLocal: 首先,它是一个数据结构,有点像HashMap,可以保存"key : value"键值对,但是一个ThreadLocal只能保存一个,并且各个线程的数据互不干扰。 ②ThreadLocal和Synchonized: 两者都用于解决多线程并发访问。但是ThreadLo

yuanchangliang的博客 1万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

ThreadLocal原理以及用法详解

ThreadLocal叫做线程变量,意思是ThreadLocal中填充的变量属于当前线程,该变量对其他线程而言是隔离的,也就是说该变量是当前线程独有的变量。ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。 同一个 ThreadLocal 所包含的对象,在不同的 Thread 中有不同的副本。 ThreadLocal 变量通常被private static修饰。当一个线程结束时,它所使用的所有 ThreadLocal 相对的实例...

怪咖@的博客 1万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

字节一面后,我又看了一遍ThreadLocal核心原理

上周在面试字节的时候,问到了ThreadLocal的核心原理,由于这个知识点当时有些淡忘,因此作此篇文章进行知识的记录,同时希望能够帮助到其他的小伙伴儿们。

小威的博客 1万+

ThreadLocal的使用及其原理

发现啥事也没做,也就说,就简单地实例化了一个对象再来看看它的成员变量赋值情况这段代码比较迷糊,好像就是为了初始化一个常量——threadLocalHashCode,等会我们再回来看看作用。

m0_60388261的博客 1177

ThreadLocal(线程变量)的底层原理

ThreadLocal的底层原理

陈玫瑰 2219

Java中的ThreadLocal、ThreadLocalMap原理学习

public class ThreadLocalTest { public static void main(String[] args) { final ThreadLocal<Integer> local = new ThreadLocal<>(); local.set(10); Thread t = new T...

wanderlustLee的博客 1635

ThreadLocal原理剖析

ThreadLocal提供线程局部变量。 这些变量与普通变量不同,因为每个访问一个线程(通过其get或set方法)的线程都有其自己的,独立初始化的变量副本。通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。而使用ThreadLocal创建的变量只能被当前线程访问,其他线程则无法访问和修改。 ThreadLocal实例通常是希望将状态与线程关联的类中的私有静态字段(例如,用户ID或事务ID)供线程局部变量。 这些变量与普通变量不同,因为每个访问一个线程(通过其get或set方法)的线程都有其自己的,

一生信仰 4040

什么是ThreadLocal,它的实现原理是什么?

作者简介:大家好,我是码炫码哥,前中兴通讯、美团架构师,现任某互联网公司CTO,兼职码炫课堂主讲源码系列专题代表作:《jdk源码&多线程&高并发》,《深入tomcat源码解析》,《深入netty源码解析》,《深入dubbo源码解析》,《深入springboot源码解析》,《深入spring源码解析》,《深入redis源码解析》等联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬。

smart_an的专栏 833

ThreadLocal原理与内存泄漏

ThreadLocal原理以及ThreadLocal内存泄漏的原因分析

m0_63743928的博客 1697

深入学习ThreadLocal原理

  上文我们学习了ThreadLocal的基本用法以及基本原理,ThreadLocal中的方法并不多,基本用到的也就get、set、remove等方法,但是其核心逻辑还是在定义在ThreadLocal内部的静态内部类ThreadLocalMap中,里面有很多设计非常精妙的地方,本文中我们就从ThreadLocalMap的角度入手深入学习ThreadLocal的原理。 1. 基本数据结构   ...

weixin_30924087的博客 187

ThreadLocal原理

概述 在java学习生涯中可能很多人都会听到ThreadLocal变量,从字面上理解ThreadLocal就是“线程局部变量”的意思。简单的说就是,一个ThreadLocal在一个线程中是共享的,在不同线程之间又是隔离的(每个线程都只能看到自己线程的值)。可能一开始把这句话放出来很难理解,那我们就继续往后面看吧。 API介绍 再学习一个类之前我们需要了解一个类的API,这也是我们学习类的入口。而ThreadLocal类的API相当简单。 在这里面比较重要的就是,get、set、remove了,.

song_myth的博客 387

ThreadLocal原理学习

什么是ThreadLocal ThreadLocal是一种数据类型,类似HashMap的key : value存储。主要用来存储线程独有的变量,各线程间互不干扰。通过get、set方法存入读取数据,操作简单。 ThreadLocal、ThreadLocalMap、Thread ThreadLocal担任get、set、remove等操作方法。ThreadLocalMap是底层数据结构,存储数据,使用动态数组Entry[]实现,它是ThreadLocal的一个内部类。Thread维护了一个类变量Thre

朱守成 661
上一篇: docker添加阿里云加速
下一篇: 常用命令
蜗牛2219
博客等级 码龄10年 1粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值