ThreadLocal 理解及面试
一、ThreadLocal 引用关系
图解关系说明:
- 每个线程拥有自己的
ThreadLocalMap
属性; - ThreadLocalMap 的存储结构为
Entry[]
数组; - Entry的Key是ThreadLocal类型且
弱引用
指向ThreadLocal对象,Value是我们自己定义的泛型值对象; - ThreadLocal的生命周期是GC,ThreadLocalMap的生命周期是和Thread同步;
解析:当线程使用Threadlocal 时,是将Threadlocal 当做自己线程属性ThreadLocalMap中一个Entry的key值,实际上存放的变量是Entry的value值,实际要使用的值是value值。
- value值为什么不存在并发问题呢,因为它只有一个线程能访问。
- threadlocal可以当做一个索引,可以有多个threadlocal 变量,不同的threadlocal对应于不同的value值,他们之间互不影响。
- ThreadLocal为每一个线程都提供了变量的副本,使得每个线程在某一时间访问到的并不是同一个对象,这样就隔离了多个线程对数据的数据共享。
强引用:GC不会被清理掉;
软引用:SoftReference内存不足时会背垃圾回收器回收;
弱引用:WeakReference 当jvm进行垃圾回收就回收;
虚引用:没有引用
二、ThreadLocal 使用方法解析
// TODO:对应源码及注释后期补上
- get——获取threadlocal局部变量
- set——设置threadlocal局部变量
- initialvalue——设置局部变量的初始值
- remove——删除该局部变量
三、ThreadLocal 常见面试解答
1. ThreadLocal和普通线程中的变量的区别?
- 普通变量在多线程环境下是线程共享的,会有并发问题;
- ThreadLocal在多线程环境下为线程私有变量,值对其他线程不可见,不会有多线程访问不安全的情况。
2. key为什么设置为弱引用?
- 强引用也无能为力:业务使用完ThreadLocal的时候,ThreadLocalRef被回收了,但是还是存在key的强引用,导致Entry对象还是无法被回收;
- 弱引用的好处:当前线程仍然运行的情况下,就算忘记调用Remove()方法,在下次使用ThreadLocal的时候,会对 key为null的Value进行清除操作,比强引用多了一层保障。
3. 为什么不使用当前线程作为当前的key?
-
直接用当前线程来作为ThreadLocalMap的key,无法区分放入ThreadLocalMap中的多个value。
比如放入了两个字符串,无法判断取出来的是哪一个字符串! -
使用ThreadLocal作为key就不一样了:每一个ThreadLocal对象都可以由ThreadLocalHashCode属性唯一区分或者说每一个ThreadLocal对象都可以由这个对象的名字唯一区分,所以可以用不同的ThreadLocal作为key,区分不同的value,方便存取。
4. 如何避免内存泄漏?
- 将ThreadLocal定义为 private static ,使生命周期更长,保证ThreadLocal的强引用一直存在而不会回收,保证在ThreadLocal的弱引用能够找到Entry的值,并remove掉(ps:这段是其他文章中抄的,我认为应该理解成:下次操作ThreadLocalMap的时候 JDK可以通过remove掉key为null的 Entry。[这个欢迎有大佬指正])
- 每次使用完ThreadLocal的时候都调用remove()方法。
5. ThreadLocal有哪些使用场景?
ThreadLocal使用于以下两种场景:
- 每个线程需要有自己单独的实例
- 实例需要在多个方法中共享,但不希望其他线程共享
- JavaWeb中使用ThreadLocal传递Session信息;
- 数据库连接,处理数据库事务;
- 日志、调用链路追踪;
相关文章:
ThreadLocal 理解及面试
一、ThreadLocal 引用关系 图解关系说明: 每个线程拥有自己的 ThreadLocalMap 属性;ThreadLocalMap 的存储结构为 Entry[] 数组;Entry的Key是ThreadLocal类型且弱引用指向ThreadLocal对象,Value是我们自己定义的泛型值对象&#…...
巾帼绽芬芳 一起向未来(中篇)
编者按:为了隆重纪念纪念“三八”国际妇女节113周年,快来与你全方位、多层次分享交流“三八”国际妇女节的前世今生。分上篇(节日简介、节日发展和节日意义)、中篇(节日活动宗旨和世界各国庆祝方式)和下篇&…...
Qt学习2-Qt Creator新建项目小tips(哔站视频学习记录)
放送两个小tips: 1、MinGW和MSVC的区别 QT学习笔记(二):QT MinGW 和 MSVC 编译方式_Leon_Chan0的博客-CSDN博客 2、如何安装QT对应版本的MSVC (1)问题描述:Qt5.12.8支持MSVC2015和MSVC2017,但是系统安装的是Visual…...
React-高阶组件
认识高级组件 高阶函数的维基百科定义:至少满足以下条件之一 1、接受一个或多个函数作为输入; 2、输出一个函数; JavaScript中比较常见的 filter、map、reduce 都是高阶函数 那么说明是高阶组件呢? 高阶组件的英文是 Higher-Order Components,简称为 HOC;官方的…...
python学习——【第一弹】
前言 Python是一种跨平台的计算机程序设计语言,是ABC语言的替代品,属于面向对象的动态类型语言,最初被设计用于编写自动化脚本,随着版本的不断更新和语言新功能的添加,越来越多被用于独立的、大型项目的开发。 从这篇…...
数据结构——链表讲解(1)
作者:几冬雪来 时间:2023年3月3日 内容:数据结构链表讲解 目录 前言: 链表的概念: 1.为什么要有链表: 2.链表的运行原理: 3.链表的形态多少: 4.单链表的代码书写࿱…...
docker部署MySQL主从服务
一.主从同步流程关于MySQL主从复制主要同步的是binlog日志,涉及到三个线程,一个运行在主节点(log dump thread),其余两个(I/O thread, SQL thread)运行在从节点,如下图所示:当主库数据发生变更时࿰…...
儿童护目台灯哪种好用?几款真的保护视力的台灯品牌推荐
儿童眼睛还未发育完全,眼睛比较脆弱,但是现在的小孩子学习任务也比较繁重,经常晚上看书写字,所以选择合适的护眼台灯来保护眼睛很重要。 选择儿童护目台灯需要注意以下几个方面: (一)色温和亮…...
游戏逆向基础之OD找CALL实践
在逆向中除了分析数据之外,另外一个重要的工作就是找算法,找CALL 例如各种功能函数:攻击CALL,走路CALL,喊话CALL等等 以及加密解密等算法需要我们先锁定其位置,然后进行逆向分析。 最常见方法一 API函数下断,例如send …...
File 文件操作
File 文件操作: 一、常用方法: 方法类型描述public File(String pathname)构造给定一个要操作文件的完整路径public File(File parent, String child)构造给定要操作文件的父路径和子文件名称public boolean createNewFile() throws IOExce…...
QT基础(18)- QAbstractSocket
QT基础(18)- QAbstractSocket1 创建简单的客户端2 QAbstractSocket2.1 简介2.2 枚举2.2.1 BingFlag2.2.2 NetworkLayerProtocol2.2.3 PauseMode2.2.4 SocketError2.2.5 SocketOption2.2.6 SocketType2.2.7 SocketState2.3 公有函数2.3.1 构造函数2.3.2 a…...
机器学习与目标检测作业:安装pytorch
机器学习与目标检测作业:安装pytorch一、 进入官网复制下载命令二、 下载的过程2.1 conda命令运行三、 测试pytorch是否安装成功安装pytorch教程 一、 进入官网复制下载命令 进入官网复制下载命令如下图所示 二、 下载的过程 下载的过程如下图所示 2.1 conda命令运…...
Android 源码中的 JNI,到底是如何使用的?
Linux下 JNI的使用学习 Android 其中涉及对 JNI 的使用;JNI的使用对于 Android 来说又是十分的重要和关键。那么到底 Java 到底是如何调用 C/C 的,下面是非常简单的计算器源码,只是用来熟悉JNI的基本语法,其中我自己碰到过的一个问…...
重磅新品 / 酷炫展品 / 强大生态,广和通玩转 MWC Barcelona 2023
2月27日,2023世界移动通信大会(MWC Barcelona 2023)在西班牙巴塞罗那正式开幕。全球知名移动运营商、设备制造商、技术提供商、物联网企业齐聚一堂,以领先的技术、创新的场景、前瞻的洞察向全行业输送最新鲜的行业观点。作为全球领…...
Hbuilder+uniapp 从零开始创建一个小程序
当你看到这篇博客的时候,那~说明~我的这篇博客写完了……哈哈哈哈哈哈哈哈。好的,清耐心往下看哈。如果有需要的,可以关注一下小作,后面还有小程序的云开发嗷~一、申请一个小程序账号(已经有账号的小可爱可以跳过&…...
亚商投资顾问早餐FM/0303支持新能源汽车消费
01/亚商投资顾问早间导读高层调研集成电路企业并主持召开座谈会商务部:今年将积极出台新政策措施支持新能源汽车消费商务部:推动农村消费进一步恢复和扩大更好助力乡村振兴干细胞应用接连获重大突破机构密集调研相关上市公司02/亚商投资顾问新闻早餐// 热…...
Spring Boot 整合分布式缓存 Memcached
Memcached是一个开源、高性能,将数据分布于内存中并使用key-value存储结构的缓存系统。它通过在内存中缓存数据来减少向数据库的频繁访问连接的次数,可以提高动态、数据库驱动之类网站的运行速度。 Memcached在使用是比较简单的,在操作上基本…...
嵌入式学习笔记——STM32单片机开发前的准备
STM32单片机开发前的准备1.集成开发环境的选取STM32 CubeIDEKEIL_MDK2.KEIL_MDK环境搭建安装包获取及安装芯片包下载及安装工程建立(STM32F407VET6为例)1.新建工程文件夹2.新建工程3.安装ST-LINK以及CH340的驱动4.设置KEIL,并烧录本文重点1.集成开发环境的选取 前面…...
客户案例|FPGA研发管理解决方案:UniPro瀑布+敏捷 打造高效能组织
2023开年以来,新享科技项目管理软件UniPro收获一波客户侧的点赞好评。在过去一年中,UniPro不断与客户保持高频沟通,满足客户需求为出发点,以产品功能实现为落脚点,不断打磨产品。 以UniPro客户京微齐力为例࿰…...
【信息学奥赛】1400:统计单词数
统计单词数也需要分割单词,如果使用字符数组来做的话,其实和1144:单词翻转类似,但是我一直只能通过四个样例,估计边界处理条件还是有点问题。 不过经过打印字符串长度之后发现了之前遇到的一个问题,即fget…...
# 技术详解: 利用CI同步文章以及多端发布
技术详解: 利用CI同步文章以及多端发布 技术详解: 利用CI同步文章以及多端发布 前言文章的同步实现的细节 思路文章元数据的定义和提取修改文章的优化本地图片资源上传CDN并替换本地link 终于到了 CI 的部分了最后来一些碎碎念 前言 前几天我更新了一篇简单技术总结之后&am…...
分形维数的计算方法汇总
以下是常用的时间序列分形维数计算方法及相应的参考文献:Hurst指数法Hurst指数法是最早用于计算分形维数的方法之一,其基本思想是通过计算时间序列的长程相关性来反映其分形特性。具体步骤是:(1) 对原始时间序列进行标准化处理。(2) 将序列分…...
微积分小课堂:积分(从微观趋势了解宏观变化)
文章目录 引言I. 预备知识: 积分效应1.1 闯黄灯1.2 公司利润(飞轮效应)1.3 飞轮效应II 积分2.1 积分的计算2.2 积分思想的本质引言 微分解决的问题是从宏观变化了解微观趋势;积分和微分刚好相反,是从微观去看宏观变化。 通过积分效应,提升我们的认识水平,同时能用一些工…...
4道数学题,求解极狐GitLab CI 流水线|第4题:合并列车
本文来自: 武让 极狐GitLab 高级解决方案架构师 💡 极狐GitLab CI 依靠其一体化、轻量化、声明式、开箱即用的特性,在开发者群体中的使用率越来越高,在国内企业中仅次于 Jenkins ,排在第二位。 极狐GitLab 流水线有 4…...
代码规范简述
目录 命名规范 代码格式 OOP规约 集合规范 并发规范 SQL语句规范 SQL 建表规范 SQL 索引规范 SQL 查询规范 控制语句规范 Javadoc 规范 其他规范 命名规范 1、包名:使用小写字母,多个单词之间用"."分隔,例如ÿ…...
【Java集合框架】篇五:Map接口
1. Map及实现类特点 Map:存储key-value HashMap:线程不安全,效率高,key和value都可以为null,底层使用 数组单向链表红黑树 结构(jdk8)。 LinkedHashMap:是HashMap的子类࿰…...
Typroa安装教程
Markdown 是一种轻量级标记语言,创始人为约翰格鲁伯(John Gruber)。 它允许人们使用易读易写的纯文本格式编写文档,然后转换成有效的 XHTML(或者HTML)文档。这种语言吸收了很多在电子邮件中已有的纯文本标记…...
【MySQL】存储引擎
目录 1.MySQL体系结构 2.存储引擎介绍 3.存储引擎特点 4.存储引擎选择 1.MySQL体系结构 MySQL整体的逻辑结构可以分为4层,客户层、服务层、存储引擎层、数据层 客户层 客户层:进行相关的连接处理、权限控制、安全处理等操作 服务层 服务层负责与客户层进行连接处理、处…...
芯驰(E3-gateway)开发板环境搭建以及调试遇到问题的解决
1-Windows下环境配置 可以在Windows上使用命令行或者IAR IDE编译SSDK项目。Windows编译依赖的工具已经包含在 prebuilts/windows 目录中,包括编译器、Python和命令行工具。 1.1.1 CMD SSDK集成 msys 工具,可以在Windows命令行中完成SDK的配置、编译和…...
【大数据监控】Prometheus、Node_exporter、Graphite_exporter安装部署详细文档
目录Prometheus简介下载软件包安装部署创建用户创建Systemd服务修改配置文件prometheus.yml启动Prometheusnode exporter下载软件包安装部署添加用户创建systemd服务启动node_exportergraphite_exporter下载软件包安装部署创建systemd服务启动 graphite_exporterPrometheus 简介…...
做期货苯乙烯的网站/东莞头条最新新闻
1.下面有关html的描述,不推荐的是? (B) A.在页面顶部添加doctype声明; B.在 </head> ... <body> 中间插入HTML代码 C.避免使用 <font> 标签 D.使用 <table> 元素展现学生成绩表等数据 2. css…...
什邡市建设局门户网站/免费建站平台哪个好
2021年的互联网行业竞争越来越严峻,面试也是越来越难,一直以来我都想整理一套完美的面试宝典,奈何难抽出时间,这套1000道的Java面试手册我整理了整整1个月,上传到Git上目前star数达到了30K 这套互联网Java工程师面试题…...
广州网站搭建/关键词组合工具
1、无论在mysql中执行什么语句,都会报以下错误:You must reset your password using ALTER USER statement before executing this statement.在网上找了一下原因,看到以下信息这就是因为数据库的这个默认的default_password_lifetime参数导致…...
济宁市住房和城乡建设局网站/外贸网站如何推广优化
不想当将军的士兵不是好士兵,这是我目前最烦的一句话,如今是一个被利欲薰黑了的世界,虽然人人有事做,却不见得事事有人做,不管你走到哪,听到的都是所谓的“个人发展”,对于一个文化群体大学生以…...
wordpress调用相关文章加速/windows优化大师好不好
原标题:0基础学习Android开发 Android开发学习路线图文章转载于:http://www.makeru.com.cn/170710/000832.html我们常常说方向不对,努力白费,不管做什么都要找到一个方向,为之努力,才可以达到成功ÿ…...
html网站引导页模板/阿里指数查询手机版
我在IIS 6.0(生产服务器上为7.0)上运行带有API的MVC应用程序.对于API,我在API.ashx文件中使用IHttpHandler实现.我对API.ashx文件进行了许多不同的API调用,但我将讲一个,它没有DB调用,因此绝对不是数据库问题.在ProcessRequest方法的最开始,我添加了Diagnostics.Stopwatch来跟踪…...