谈一谈不常见却又不可少的ThreadLocal

【ThreadLocal实现原理,为什么内存泄漏,怎么解决的内存泄漏】 阅读详情

在写ThreadLocal之前,需要先巩固下一点相关知识:Java内存模型及共享变量的可见性。

内存模型中所有变量存储在主内存中,当一个线程中要使用某个变量时,需要从主内存复制该变量到其线程内才能操作,此时线程中操作的是主内存变量的副本,操作完成后再刷回主内存。刷回的实质就是变量赋值

如果多个线程访问同一个变量时,每个线程都具有一个副本,操作完毕后都会刷回主内存,刷回时间存在先后,则赋值有先后,当然后者会覆盖前者,这是造成可见性问题的次要原因。

引入以上知识点后,再来说明ThreadLocal。一个线程想使用某个变量,于是从主内存复制该共享变量到线程内部中。使用完毕后想再下次再次使用该变量时,得到的变量副本是上次使用的副本,而不是从主内存的变量再次复制过来的副本,并且不想让其他线程影响到该变量。这就是ThreadLocal的目的,其实现不是通过共享变量这种方式实现的,详细内容下面介绍

目的很明确,但是身处JAVA内存模型中要遵循内存模型规范,下面看看JDK是如何即满足内存模型规范,又满足ThreadLocal目的。

满足内存模型

这点很简单,就是你该怎么样还怎么样,仍然受你管辖,该复制就复制,该刷回就刷回,不可见还是会造成不可见。

满足ThreadLocal目的

多个线程都能访问的变量才叫共享变量,如果控制变量的访问方式,使其他线程线程不能访问就可以了。控制方式就是将线程与变量的一一对应,将该变量的访问入口控制到只有该线程即可,JDK中的做法就是让线程持有这个变量(绑定到线程本身)

线程可以绑定变量,但是并不知道需要绑定多少个,于是将这个存储功能还是交给专门的数据结构—>Map。并且还专门设计了一个用来访问这个Map的工具,这个工具就是ThreadLocal。并且这个Map的key为ThreadLocal实例的引用地址,value存储真正的变量。

这样设计就到达目的了。ThreadLocal构建时接收个泛型告诉你存储的变量是一个对象类型。

 

ThreadLocal设计

核心Map设计

static class ThreadLocalMap {
    static class Entry extends WeakReference<ThreadLocal<?>> {
        /** The value associated with this ThreadLocal. */
        Object value;

        Entry(ThreadLocal<?> k, Object v) {
            super(k);
            value = v;
        }
    }
...
}

这里Map的Entry被设计为弱引用。

内存存储图示如下

弱引用WeakReference

WeakReference是Java语言规范中为了区别直接的对象引用(程序中通过构造函数声明出来的对象引用)而定义的另外一种引用关系。WeakReference标志性的特点是:reference实例不会影响到被应用对象的GC回收行为(即只要对象被除WeakReference对象之外所有的对象解除引用后,该对象便可以被GC回收),只不过在被对象回收之后,reference实例想获得被应用的对象时程序会返回null。

这里使用弱引用的原因:ThreadLocal目的就是达到变量只能自己访问别的线程不能访问的目的,Map设计的key为ThreadLocal实例的引用地址,value为变量,当线程存在而ThreadLocal实例被回收时,Map中的value还是存在的(原因后续说明)致使该变量的可达性分析失败,从而导致此阶段的内存泄露。当设计为弱引用后,如果key被销毁了(强引用销毁),那么value就处于可被回收状态,从而避免内存泄露。

临时内存泄露图示

STM32CubeMX平台F4系列固件下载核心要点 详解STM32CubeMX平台下F4系列单片机的固件包下载方法与常见问题,重点讲解stm32cubemx固件包下载流程及配置技巧,帮助开发者快速完成开发环境搭建。 阅读详情

相关推荐

云计算学习——5G网络技术

华为eNSP网络设备模拟器的基础安装及简单使用

qq_42520799的博客 1445

win11 使用 QEMU 配置龙芯 3A5000 虚拟环境

win11 使用 QEMU 配置龙芯 3A5000 虚拟环境

一朵花开的时间 6155

《双剑合璧:双 IMU 驱动的高精度 AHRS 实战宝典(基于 ROS2)》

本文系统阐述了基于双IMU的高精度姿态与航向参考系统(AHRS)设计与实现方法。文章首先分析了传统单IMU系统的局限性,提出通过双IMU冗余配置实现性能互补的方案。从硬件设计要点(包括IMU选型策略、电路降噪方法、PCB布局规范),到算法实现方案(互补滤波、卡尔曼滤波等融合算法),再到ROS2软件架构与调优策略,全方位展示了双IMU系统的技术实现路径。特别强调快速性与高精度平衡的方法,包括动态参数调整、双IMU权重优化等核心技巧。最后总结了硬件降噪、算法调优等实用心法。

bother3000的博客 2024

保姆级教程:用Docker Compose一键部署WVP-PRO+ZLM+录像服务(含Nginx反代)

本文提供了一套完整的容器化GB28181视频平台部署方案,通过Docker Compose实现WVP-PRO、ZLMediaKit(ZLM)和录像服务的一键式部署。详细介绍了环境准备、架构设计、容器化部署实战以及高级配置优化,帮助用户快速搭建高性能视频监控管理平台,适用于安防行业和物联网设备管理场景。

weixin_30415113的博客 861

导出库的版本_Windows下PaddleOCR在C++中的推理部署(CPU版本)CMake + VS2017

PaddleOCR是一个与OCR相关的开源项目,不仅支持超轻量级中文OCR预测模型,总模型仅8.6M(单模型支持中英文数字组合识别、竖排文本识别、长文本识别,其中检测模型DB(4.1M)+识别模型CRNN(4.5M)),而且提供多种文本检测训练算法(EAST、DB)和多种文本识别训练算法(Rosetta、CRNN、STAR-Net、RARE)。本文将教大家通过PaddleOCR(CPU版...

weixin_31304817的博客 1914

从IMU数据到精准定位:手把手推导ESKF中的四元数运动学与误差状态方程

本文详细介绍了如何从IMU数据推导ESKF中的四元数运动学与误差状态方程,实现精准定位。通过分析误差状态卡尔曼滤波器的优势、四元数表示的必要性,以及IMU测量模型和运动学基础,提供了完整的数学推导和实现要点。适合机器人定位和自动驾驶领域的算法工程师参考,帮助优化导航系统性能。

weixin_30271335的博客 680

基于ESP32的智能停车场管理系统开发

智能停车场管理系统通过引入物联网(IoT)技术,实现对停车场内车辆的实时监控、空闲车位的管理、车辆的入场与出场控制等功能,大大提高了停车场的利用率和管理效率。通过集成物联网技术、云平台以及先进的传感器和执行器,系统不仅能实时监控停车场的车位状态,还能提供更好的用户体验。本文将介绍如何基于ESP32开发一个智能停车场管理系统,涵盖系统架构、硬件选择、软件开发以及最新技术的应用,帮助开发者实现高效的智能停车管理。ESP32的代码主要负责处理车位传感器的数据,控制LED指示灯的状态,以及与云平台进行数据交互。

2201_76125393的博客 912

计算机网络基础:认识网络硬件与传输介质

计算机网络基础:认识网络硬件与传输介质,在计算机网络的庞大体系中,网络硬件与传输介质犹如坚实的骨架与脉络,支撑并承载着信息的流动。从家庭中的小型网络,到企业复杂的办公网络,再到覆盖全球的互联网,各类网络硬件设备各司其职,不同的传输介质发挥着独特的传输作用。它们相互协作,使得数据能够在不同设备之间快速、准确地传输,为人们的日常沟通、工作办公、娱乐休闲等活动提供了基础保障。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 3万+

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Statistics and Machine Learning Toolbox

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

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

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

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

上一篇: 京东资深技术专家在线分享“微服务架构与实践”实战笔记!
下一篇: 阿里校招成功上岸分享,这份Java核心笔记建议收藏!
java架构师小芷
博客等级 码龄6年 216粉丝 519原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值