ThreadLocal详解

“迎圣诞,拿大奖” 活动赛题 Web-SQLi 1. php中sprintf()函数漏洞原理及其利用; 2. mysql盲注语法及python脚本; 3. sqlmap的需要进一步学习; 阅读详情

ThreadLocal学习笔记

什么是ThreadLocal

ThreadLocal是线程变量,ThreadLocal中放的变量是属于当前线程的,该变量对于其他线程而言是隔离的。ThreadLocal为变量在每个线程中创建一个副本,每个线程可以访问自己线程内的副本。

ThreadLocal的优势:

  • 进行对象跨层传递时,使用ThreadLocal可以避免多层传递,在ThreadLocal中存取数据即可;
  • 线程间的数据隔离,每个线程维护自己的变量,对其他线程不可见;

ThreadLocal示例

package com.ludk.study.threadlocal;

import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * @author ludengke
 * @title: ThreadLocalTest
 * @projectName weixin
 * @description: TODO
 * @date 2023/11/1816:09
 */
public class ThreadLocalTest {
    public static void main(String[] args) {
        testThreadLocal();
    }
    public static void testThreadLocal(){
    	//线程变量,每个线程都有自己的变量副本
        final ThreadLocal<String> local=new ThreadLocal<String>();
        //启动了5个线程,线程的名字为线程finalI。local为线程外的公共变量,正常情况线程不安全。
        //可因为他是ThreadLocal,每个线程都有自己的变量副本,因此打印结果是线程名称和线程自己的变量。
        for (int i=0;i<5;i++){
            final int finalI = i;
            new Thread(new Runnable() {
                public void run() {
                    local.set(finalI +"啊啊啊");
                    System.out.println(Thread.currentThread().getName()+":"+local.get());
                    try {
                        TimeUnit.SECONDS.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            },"线程"+finalI+":").start();
        }
    }
}


线程0::0啊啊啊
线程3::3啊啊啊
线程2::2啊啊啊
线程1::1啊啊啊
线程4::4啊啊啊

Process finished with exit code 0

ThreadLocal的原码分析

ThreadLocal的设计关注三个点

  • ThreadLocal
  • ThreadLocalMap
  • Thread

先上结论:

  • Thread
    每个线程都有自己的ThreadLocalMap
  • ThreadLocalMap
    key ThreadLocal
    value 值
    比如有的地方定义了“sessionThreadLocal”,有的地方定义了“dataThreadLocal”,那ThreadLocalMap中就存储了这两个值,而且这两个值只属于当前线程,因为一个线程有自己对于的ThreadLocalMap

java.lang.ThreadLocal set

public void set(T value) {
		//获取当前线程
        Thread t = Thread.currentThread();
        //获取ThreadLoclMap
        ThreadLocalMap map = getMap(t);
        if (map != null)//如果获取到ThreadLocalMap,则放入数据,key为ThreadLocal,value为值
            map.set(this, value);
        else
        	//否则创建ThreadLocalMap
            createMap(t, value);
    }

从creatMap方法及下面图片的代码可以看出,每个线程会有自己的ThreadLocalMap

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

在这里插入图片描述
通过ThreadLocalMap的构造方法可以看出,ThreadLocalMap的key是ThreadLocl,value是想存储的值

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);
}

ThreadLocalMap是ThreadLocal的静态内部类,是真正存储线程变量的地方
ThreadLocal的代码结构
其他方法如remove可以自己分析。

ThreadLocal的应用场景

每个线程需要自己单独的变量,这种场景均可以考虑ThreadLocal

  • 存储用户session
  • 存储数据库连接
  • 数据跨层传递
  • 解决线程安全问题:但是他与synchronized有很大的区别。synchronized是加锁,某个安全点内,只有一个线程可以访问变量。而ThreadLocal是每个线程都有自己的变量,线程间的变量是隔离开的。
微信小程序 - 解决请求报错 request:fail errcode:-201 cronet_error_code:-201 error_msg:net::ERR_CERT_DATE_INVALID 微信小程序报错“request:fail errcode:-201 cronet_error_code:-201 error_msg:net::ERR_CERT_DATE_INVALID“,微信小程序请求报错,微信小程序errcode:-201,服务器报错,无法调用接口,微信小程序真机https请求失败,微信小程序wx.request接口报错,小程序真机调试运行接口都报错了,真机测试下网络请求都不行了且报错,证书没问题依旧报错,检查HTTPS证书,ssl证书,使用浏览器测试访问证书是正常的,不是证书问题,请 阅读详情

相关推荐

MATLAB App Designer 实现多窗口交互与数据传递实战

本文详细介绍了如何使用MATLAB App Designer实现多窗口交互与数据传递的实战技巧。从基础的多窗口应用设计到高级的动态窗口创建,涵盖了窗口调用控制、数据传递方法、状态管理及用户体验优化等核心内容,帮助开发者高效构建复杂的MATLAB GUI应用。

milk5的博客 664

ThreadLocal 详解

总结了ThreadLocal的底层实现原理,分析了内存泄漏的相关问题,以及ThreadLocal的最佳实践。

TheAnnoyingDog的博客 1306

Type-C连接中的CC引脚:Rp与Rd电阻的识别与供电模式选择

本文深入解析Type-C接口中CC引脚的核心功能,包括Rp与Rd电阻的识别原理及供电模式选择机制。通过详细的分压计算和实战案例,揭示Type-C设备如何通过CC引脚实现方向检测、角色识别和供电协商,为硬件设计提供关键指导。

weixin_30616969的博客 341

史上最全ThreadLocal 详解

ThreadLocal叫做线程变量,意思是ThreadLocal中填充的变量属于当前线程,该变量对其他线程而言是隔离的,也就是说该变量是当前线程独有的变量。ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。ThreadLoal 变量,线程局部变量,同一个 ThreadLocal 所包含的对象,在不同的 Thread 中有不同的副本。因为每个 Thread 内有自己的实例副本,且该副本只能由当前 Thread 使用。

qq_43842093的博客 1万+

企业如何利用群晖 NAS 构建高效数据备份与容灾体系

群晖 NAS 不仅是一个企业级文件存储设备,更是一个完整的数据保护平台。通过 Active Backup for Business、快照技术和多层次容灾方案,企业可以在确保数据安全的同时,实现业务的高可用与持续性。在当今充满不确定性的环境下,企业应将数据备份与容灾体系作为 IT 战略的重要组成部分,而群晖 NAS 则是一个值得信赖的核心基石。

Trihawk的博客 491

无感无刷电机控制进阶:反电动势过零检测的5种实现方案对比

本文深入探讨无感无刷电机控制中反电动势过零检测的5种实现方案,包括电阻分压虚拟中性点法、专用BEMF检测IC方案、基于ADC采样的数字锁相环、无传感器观测器技术及混合方案创新实践。通过对比分析各方案的优劣及适用场景,为电机控制工程师提供实用的技术选型指南,助力提升系统性能与成本效益。

weixin_28691741的博客 843

ThreadLocal-详解

ThreadLocal是Java提供的线程局部变量机制,通过为每个线程创建变量副本来实现线程隔离,避免同步开销。核心原理是利用Thread内部的ThreadLocalMap存储数据,以ThreadLocal实例为key。主要应用场景包括线程上下文传递、数据库连接管理、参数传递简化和线程安全工具类实现。但需警惕内存泄漏风险:ThreadLocalMap的key是弱引用而value是强引用,若不及时调用remove()方法可能导致内存泄漏。最佳实践包括:使用后立即remove()、声明为private stat

M_Reus_11的博客 1156

Qlib:微软开源的AI量化投资平台 极简入门快速上手教程:使用 Qlib 进行中芯国际股价回测和预测

Qlib是由微软开源的面向AI量化投资的工具包。它提供了构建量化投资模型所需的基础设施,旨在帮助研究者和从业人员更高效地进行量化研究和策略开发。

AI天才研究院 5410

【Java】ThreadLocal详解

ThreadLocal 详解

啊松同学的博客 1450

Orange3实战教程:文本挖掘---主题建模

主题建模通过LDA、LSI或HDP算法分析文档集合,自动发现隐含主题结构。组件输入为文档语料库,输出包括带主题权重的语料库、主题词分布及完整主题数据。不同算法特性各异:LSI允许正负权重但解释性较弱,LDA更易解释,HDP参数复杂需谨慎设置。结果可结合词云、热力图等可视化工具分析主题特征及分布。示例显示如何通过预处理文本、选择算法(如提取5个LDA主题),并利用MDS和箱线图探索主题间关系及关键词分布。

err2008的专栏 362

MicroCap声学仿真介绍(五)-倒相管扬声器系统仿真

实际倒相管的扬声器单体选择、后腔容积、倒相管的直径和长度都是需要精心挑选的,为了便于演示,随意指定了倒相管的长度和直径,现实中还是不能这么随便的。之前介绍了封闭式扬声器的仿真,今天在封闭式扬声器的基础上,再介绍一下倒相管扬声器系统的仿真。

山无忧的博客 1718

9、详解ThreadLocal

深入理解ThreadLocal与ThreadLocalMap以及Thread三者之间的关系;详细解释了ThreadLocalMap的key值为什么要用弱引用,解释了为什么用了弱引用依旧会出现内存溢出情况;从强引用、软应用、弱引用、虚引用这四种引用解释了为什么源码要使用弱引用;详解了部分面试题,以及ThreadLocalMap是如何解决哈希冲突,如何触发扩容机制,扩容的会是原来的多少倍等问题...

PingFanXianSheng的博客 474

YOLOv8改进策略【YOLO和Mamba】| 2024 VM-UNet,高效的特征提取模块VSS block 二次创新提高精度

VM-UNet模型设计的出发点是解决现有CNN-based和模型在医学图像分割中的局限性,利用(SSMs)的优势,提出一种更有效的医学图像分割模型。具体来说,CNN-based模型在捕捉长距离信息方面存在不足,而模型由于自注意力机制的二次复杂度导致计算负担较重。SSMs模型如Mamba不仅在建模长距离依赖方面表现出色,还具有线性计算复杂度,这为VM-UNet的设计提供了理论基础。

Limiiiing的博客 616
上一篇: java 类加载器
下一篇: windows 下安装zookeeper
ludkjava
博客等级 码龄11年 173粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值