TheadLocal线程本地变量

并发编程处理实战篇9:线程本地变量ThreadLocal PS: 关于多线程共享变量ThreadLocal<T> 变量值的共享可以使用public static 变量的形式,所有的线程都可以使用同一个public static变量。如果想实现每一个线程都有自己的共享变量,如何实现? JDK中提供了类ThreadLocal<T>可以解决这样的问题。原理: ThreadLocal所属包java.lang.ThreadLocal<T> 是个泛型class ThreadLocal为解决多线程并发问题提供了新的思路,使用这个类库可以 阅读详情

复习再复习,结果面试被提问,回答得乱七八糟。这里对这个概念做总结!!!

threadlocal高并发使用

ThreadLocal的简单理解(五句话讲完面试)

  • 多线程共享同一变量,必须使用变量加锁同步操作。效率低。
  • 使用ThreadLocal变量,使每个线程使用同一个ThreadLocal变量时候copy一份到自己线程的本地私有的线程变量中。
  • 线程本地变量只有线程自己可以访问,其他线程无法访问,就不会出现多线程的线程安全的问题。
  • ThreadLocal不支持继承,父线程的值,不会继承到子线程里。如例子了主线程设置“ddd”也不影响子线程。
  • 每个线程拥有共享变量的副本,直接对这个副本进行操作不会影响到共享变量。

 

 

ThreadLocal的代码解析

ThreadLocal线程变量添加值。

/*获取当前线程对象 t,
*获取线程对象t内部的ThreadLocalMap变量
*线程t的ThreadlocalMap变量不为空则对其赋值
*为空则创建一个新的map到该线程变量
*/ 

/*每个线程内部都有ThreadLocalMap类型变量*/

public class ThreadLocal<T> {
 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 getMap(Thread t) {
        return t.threadLocals;
    }
}
public class Thread implements Runnable {
   ThreadLocal.ThreadLocalMap threadLocals = null;
    ThreadLocal.ThreadLocalMap inheritableThreadLocals = null;
}

 ThreadLocalMap的创建和赋值 

Map对象里有键值对数组table,初始长度16

public class ThreadLocal<T> {  
  void createMap(Thread t, T firstValue) {
        t.threadLocals = new ThreadLocalMap(this, firstValue);
    }
 static class ThreadLocalMap {
        private static final int INITIAL_CAPACITY = 16;
        private Entry[] table;
            ThreadLocalMap(ThreadLocal<?> firstKey, Object firstValue) {
            table = new Entry[INITIAL_CAPACITY];
            int i = firstKey.threadLocalHashCode & (INITIAL_CAPACITY - 1);
            table[i] = new Entry(firstKey, firstValue);
            size = 1;
            setThreshold(INITIAL_CAPACITY);
        }
}
}

 threadlocal相关的存储结构

 

 

 

 

 

 

 

 

 

 

PCIe链路均衡实战:从Preset调节到系数优化的完整指南(附Synopsy IP案例) 本文深入解析PCIe链路均衡技术,从Preset调节到系数优化的全流程实战指南,特别针对PCIe 3.0/4.0中的Recovery.Equalization状态进行详细说明。通过Synopsy IP案例,展示如何应对高速信号完整性挑战,优化前向反馈均衡(FFE)机制,提升系统性能。 阅读详情

相关推荐

XMind文件解析黑科技:用Python实现版本自适应读取(兼容2010-2024)

本文深入探讨了如何利用Python实现XMind文件的版本自适应解析,兼容从2010到2024年的各版本。通过分析XMind文件作为ZIP压缩包的本质,文章提供了智能探测文件内部结构(JSON或XML)并构建健壮读取逻辑的完整方案,有效解决了版本兼容性难题,并演示了将解析数据转换为PlantUML等下游应用的实战案例。

weixin_29041767的博客 682

ThreadLocal(下) ThreadLocal继承性解决方案

ThreadLocal的前世今生详细介绍以及原理讲解

小铛D的博客 1941

【规则引擎连载3】 WebSphere ILOG JRules 开发——新建一个规则项目

规则项目依赖于bom,bom来自于一个Java项目,所以在建规则项目之前,需要先建立一个Java项目,也就是建模。 说明:原则上是一个规则项目,一个bom。如果规则项目很多,并且每个规则项目的bom都是一样的,那么可以将bom提取出来,单独作为一个项目,这样减少不必要的重复操作,减少维护成本,降低出错几率。这里逐步讲解两种方法来创建规则项目,推荐第二种。 本文主要建立两种规则项目与bom之间的关系,编写相关的规则内容,如操作规则、规则流、决策表等,在后续文章中详细讲解 。

manman的分享 2330

ThreadLocal 解决多线程变量共享问题

版权声明:本文由吴仙杰创作整理,转载请注明出处:https://segmentfault.com/a/1190000009236777 1. ThreadLocal ThreadLocal 不是一个线程,而是一个线程的本地化对象。当某个变量在使用 ThreadLocal 进行维护时,ThreadLocal 为使用该变量的每个线程分配了一个独立的变量副本,每个线程可以自行操作自己对应的变量副本,而...

binbinbintony的博客 2957

RK3588 部署 YOLO26 目标检测:从环境搭建到 NPU 推理

采集图像(500+ 张,覆盖不同光照和角度)→ 筛选(删除模糊、无目标的图像)→ LabelImg 标注(选择 YOLO 格式)→ 划分 train:val:test = 7:2:1labelImg├── train/├── val/nc: 3类别顺序必须与 LabelImg 标注时一致。YOLO26 在 RK3588 上的部署流程是 PC 端训练 → ONNX 导出(opset=11)→ RKNN 转换(INT8 量化)→ 板端推理。

LXY_LOVE36的博客 418

FT2004(D2000)开发实战之网口stmmac报错调试(Failed to reset the dma)

网口stmmac报错调试(Failed to reset the dma)

嵌入式Linux 3584

TheadLocal 原理及实践

目录 ThreadLocal 实现原理 使用场景 使用实例 ThreadLocal 线程本地存储,为变量在每个线程中都创建一个副本(在Thread中存储以ThreadLocal为key的值),每个线程可以访问自己内部的副本变量。 实现原理 ThreadLocal内部用ThreadLocalMap来存储变量值,实际上线程本地变量存储在Thread类...

it小奋 1063

在 ABAP 环境中构建自定义健康监控指标:面向 SAP Cloud ALM 与 SAP Focused Run 的完整实践

本文介绍了在ABAP环境中开发自定义健康监控指标的方法。主要内容包括:1)标准监控指标的不足,如无法反映业务应用层面的问题;2)自定义监控架构,通过metric provider定义指标,由采集作业周期性获取数据并存储;3)核心实现技术,包括IF_GSM_API_PROVIDER接口和三个关键方法;4)指标从ABAP推送到SAP Cloud ALM/Focused Run的完整流程;5)开发实践步骤,从业务分析到具体实现。该方案可帮助团队监控业务关键指标,提升系统运维能力。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 262

TheadLocal解析

ThreadLocal解析 1、ThreadLocal的简单使用 ThreadLocal tl = new ThreadLocal(); tl.set(T); //设值 t1.get(); 2、原理分析 先看一下ThreadLocal的set(T value)方法的源码 public void set(T value) { Thread t = Thread.currentThread(...

努力吧少年!GO 178

快速傅里叶变换(FFT)的汇编实现在DSP开发中

在数字信号处理(Digital Signal Processing,DSP)开发中,使用汇编语言实现FFT可以进一步提高计算性能和优化系统资源的使用。FFT是一种分治算法,它通过将一个长度为N的离散时间域序列分解为多个长度为N/2的子序列,然后递归地进行计算。开发者可以根据实际需求,结合具体的硬件平台和编译器工具链,对FFT的汇编实现进行优化和定制化。需要注意的是,上述示例代码中只给出了FFT的基本框架,具体的合并操作及其他细节需要根据实际需求进行实现。上述示例代码演示了一个简单的FFT汇编实现。

QoTypescript的博客 683

【学习系列】SAP RAP 8:行为定义-Authorization Control

本文介绍了SAP RAP中的授权控制实现方法,主要分为读取操作和修改操作两种场景。读取操作通过ABAP CDS的数据控制语言(DCL)实现,使用访问控制对象限制数据可见范围;修改操作则通过行为定义中的权限检查,包括全局授权、实例授权和预检查三种方式。文章详细说明了如何使用DCL创建访问控制规则,并通过实例演示了全局授权和实例授权的代码实现方法,以及预检查功能在数据更新前的权限验证。这些授权控制机制共同确保用户只能访问和操作其权限范围内的数据,有效保障系统安全性。

DeveloperMrMeng的博客 434

TheadLocal相关

情况是否需要 remove()说明普通短生命周期线程不必线程结束后 ThreadLocalMap 随线程回收线程池线程 / 长期线程必须避免 value 长期被强引用,导致内存泄漏key 弱引用 + value 强引用→ 仅仅 ThreadLocal 对象被回收不会自动回收 value。remove()是手动清理 value,尤其在线程池场景非常重要。如果你愿意,我可以画一张ThreadLocal 内存泄漏示意图,显示线程池线程 + ThreadLocalMap + key/value。

Running_boy_的博客 1409

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Theadlocal和它造成的内存泄露

Theadlocal和它造成的内存泄露 ThreadLocal、Thead、TheadMap。 Thead类里有一个成员变量是TheadMap类型,这个TheadMap类的每一个entry的key是Theadlocal类,value就是Theadlocal类中存储的对象。对Theadlocal进行get和set时都是通过当前线程获取TheadMap对象,然后以当前Theadlocal对象...

dig73817的博客 272

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

ThreaLocal和InheritalblThreadLoal的用法,子线程获取父线程的本地变量

ThreaLocal中设置的变量,在子线程中无法获取 public class ThreadLocalExtendTest { //创建线程变量 public static ThreadLocal<String> threadLocal=new ThreadLocal<>(); public static void main(String[]...

hello world 404

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

java多线程:谈谈对TheadLocal的理解

ThreadLocal有一个静态内部类ThreadLocalMap,ThreadLocalMap又包含了一个Entry数组,Entry本身是一个弱引用,他的key是指向ThreadLocal的弱引用,Entry具备了保存key value键值对的能力。但是这样还是会存在内存泄露的问题,假如key和ThreadLocal对象被回收之后,entry中就存在key为null,但是value有值的entry对象,但是永远没办法被访问到,同样除非线程结束运行。

学亮编程手记 260

聊聊TheadLocal

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33717298的博客 127

TheadLocal的理解

ThreadLocal是什么? ThreadLocal是用来维护线程中的变量不被其他线程干扰而出现的一个结构,内部包含一个ThreadLocalMap类,该类为Thread类的一个局部变量,该Map存储的key为ThreadLocal对象自身,value为我们要存储的对象,这样一来,在不同线程中,持有的其实是当前线程的变量副本,与其他线程完全隔离,以此来保证线程执行过程中不受其他线程的影响。 Th...

KongJHong的博客 525

Python多线程 - 使用TheadLocal传递参数

# -*- coding:utf-8 -*- """ 一个ThreadLocal变量虽然是全局变量,但每个线程都只能读写自己线程的独立副本,互不干扰。 ThreadLocal解决了参数在一个线程中各个函数之间互相传递的问题。 """ import threading # 获取ThreadLocal实例 local_var=threading.local() def show(): p

Money多多 4665

Java多线程之TheadLocal概念 *

概述 ThreadLocal是实现线程封闭的最好方法。ThreadLocal内部维护了一个Map,Map的key是每个线程的名称,而Map的值就是我们要封闭的对象。每个线程中的对象都对应着Map中一个值,也就是ThreadLocal利用Map实现了对象的线程封闭。 是线程级别隔离的局表变量,即使是static变量,对于不同的线程也是不共享的,每个线程都互相独立的,互相看不见,当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变

张俊杰 的博客 588

【内核研究】线程局部存储_TheadLocal

通过调用Looper的静态方法prepare()为线程创建MessageQueue对象,代码如下: private static void prepare(boolean quitAllowed) { if (sThreadLocal.get() != null) { throw new RuntimeException("Only one Looper may be created per thread"); } sThre

博客 1422

java多线程---TheadLocal分析

ThreadLocal 分析 ThreadLocal 作用 ThreadLocal 可以看做是一个线程的副本,每个线程中的ThreadLocal都是不一样的。访问ThreadLocal就是在访问只属于线程自己的变量。那么,这个是怎么做到,每个线程都有自己的ThreadLocal?看下面2个方法 set public void set(T value) { Thread t = Threa...

韩也的博客 456

java TheadLocal 多线程资源使用

java TheadLocal 多线程资源使用

鱼泽弋海的专栏 1345

TheadLocal:当前线程的全局变量

ThreadLocal是 Java 中的一个类,它提供了一种线程封闭的机制,用于在多线程环境下实现线程级别的变量副本,并确保每个线程都可以独立访问和修改自己的副本,而不会影响其他线程的副本。// 返回当前线程关联的变量副本// 设置当前线程关联的变量副本为指定值// 移除当前线程关联的变量副本// 其他方法...ThreadLocal是一个泛型类,通过类型参数T来指定变量的类型。它提供了get()set()和remove()方法来操作当前线程关联的变量副本。get()

tszc95的博客 484

TheadLocal一文让你读懂

前言 现在正是抗击新型冠状病毒关键时期,为了响应国家号召在家休息减少外出这是作为我们普通老百姓对国家最大的贡献,同时必要外出时必须要戴上口罩,回家后需要使用消毒剂或肥皂洗手。相信国家和一线的工作者还有我们广大的人民群众我们一定能够战胜。有关最新疫情实时数据可以查看官方数据以下链接直达! 疫情实时大数据报告 新型肺炎确诊患者相同行程查询工具 什么是ThreadLocal 回到今天的主题,Thr...

liyong1028826685的专栏 611

TheadLocal

一:ThreadLocal的核心机制 1:每个Thread线程内部都有一个Map。 2:Map里面存储线程本地对象(key)和线程的变量副本(value) Thread内部的Map是由ThreadLocal维护的,由ThreadLocal负责向map获取和设置线程的变量值。所以对于不同的线程,每次获取副本值时,别的线程并不能获取到当前线程的副本值,形成了副本的隔离,互不干扰 get(...

eafun_888的博客 439

讲下你对TheadLocal 的理解

概念: ThreadLocal在线程对其进行访问时,会在线程本地创建一个变量副本,对副本进行操作, 从而达到线程间的隔离。 而普通的同步机制中,是通过对象加锁来实现多个线程对共享资源的安全访问的。 如果你需要在多个线程之间进行通信,则使用同步机制;如果需要隔离多个线程之间的共享冲突,可以使用ThreadLocal; 为什么ThreadLocalMap的entry继承WeakReference<ThreadLocal<?>>,即entry的key是弱引用? Map中的key为

m0_37840000的博客 186
上一篇: java比较器Comparator原理笔记
下一篇: idea快捷键,maven插件功能
zero_cctv
博客等级 码龄8年 1粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值