ThreadLocal相关使用

简介: ThreadLocal相关使用

ThreadLocal相关使用

简介

ThreadLocal类用来提供线程内部的局部变量,这种变量在多线程环境下访问(通过get和set方法访问)时能保证各个线程的变量相对独立于其他线程内的变量。ThreadLoca实例通常来说都是private static类型的,用于关联线程和线程上下文。

三个方面讨论ThreadLocal:

  1. 线程并发:如果是单线程,也就i用不到ThreadLocal来存储独立于其他线程的变量了,只有在多线程并发情况下,ThreadLocal用处得以体现。
  2. 传递数据:我们可以通过ThreadLocal中存储变量在线程中的不同组件之间传递数据。
  3. 线程隔离:指的是不同线程的ThreadLocal是相互隔离,相互不影响的。

ThreadLocal常用方法

  1. ThreadLocal()方法:创建ThreadLocal对象。
  2. set() 设置当前线程绑定的局部变量
  3. get() 获取当前线程绑定的局部变量
  4. remove() 移除当前线程绑定的局部变量

ThreadLocal和synchronized区别

ThreadLocal

ThreadLocal采用的是空间换时间的方式,在每个线程中可以保存一个变量的副本,保证多线程之间不会相互影响,

**侧重:**多个线程并发执行时数据相互隔离。

synchronized

synchronized采用的是时间换空间的方式,只提供一分变量,但是让多个线程顺序执行,从而达到的互不影响。

**侧重:**多个线程之间资源同步。

ThreadLocal的内部设计

JDK1.8以前的设计

ThreadLocal的底层是使用map进行实现的,map的key是当前线程,value就是当前线程中要存储的变量,每个线程其内部ThreadLocalMap用于存储对应的键值对。

JDK1.8及以后的设计

ThreadLocal的底层是使用map进行实现的,和之前的区别就是map的key使用ThreadLocal存储的。而不再是当前线程Thread,且一个线程中可以有多个 ThreadLocal,存储在 ThreadLocalMap中,同样的 ThreadLocalMap也有初始大小和阈值,初始大小为16,阈值为当前大小的三分之二。

(1)每个Threads线程内部都有一个Map(ThreadLocalMap)

(2)Map里面存储ThreadLocal对象(key)和线程的变量副本(value)

(3)Thread内部的Map是由ThreadLocal维护的,由ThreadLocal负责向map获取和设置线程的变量值。

(4)对于不同的线程,每次获取副本值时,别的线程并不能获取到当前线程的副本值,形成了副本的隔离互不干扰。

内存泄漏及解决方法

弱引用相关问题

ThreadLocalMap结构

ThreadLocalMap中的节点继承的是软引用,ThreadLocalMap没有继承Map接口,采用独立的方式实现map的功能。

弱引用会造成内存泄漏吗?

答案:会就算是弱引用,在垃圾回收的时候ThreadLocal被回收,但是Entry中的还有对应的value,同样还是会照成泄露,只能通过remove把value移除或者线程执行借宿移除。

最终解决方案

避免内存泄露的两种方式:

  1. 使用完ThreadLocal,调用remove方法删除对应的entry
  2. 使用完ThreadLocal ,当前线程也随即结束。

ThreadLocalMap存储的时候Map冲突

底层采用的解决方法:线性探测法,当从图的时候查看下一个位置是否满足要求,超过map的长度后从头开始。

相关文章
|
7月前
|
索引 Python
[oeasy]python092_eval_衡量_转化为列表
本文探讨了 Python 中 `eval` 函数的用法及其与字符串和列表之间的转换关系。通过实例分析,展示了如何使用 `eval` 将字符串转化为对应的数据类型,例如将表示列表的字符串转回列表。同时,文章深入讲解了 `eval` 的工作机制,包括根据本地和全局变量对字符串进行计算的能力。此外,还提醒了命名变量时需避免覆盖内置类名(如 `str`、`int`、`list`)的重要性,以免影响程序正常运行。最后,简要提及字符串和列表索引中负数的应用,并为读者提供了进一步学习的资源链接。
141 2
replaceAll 的用法总结
replaceAll 的用法总结
|
机器学习/深度学习 人工智能 自然语言处理
新一代AI搜索引擎神器推荐及效果测试:秘塔AI、天工AI、Perplexity等
新一代AI搜索引擎神器推荐及效果测试:秘塔AI、天工AI、Perplexity等
新一代AI搜索引擎神器推荐及效果测试:秘塔AI、天工AI、Perplexity等
|
数据安全/隐私保护
本地搭建CFimagehost私人图床【公网远程访问】(2)
cpolar会为每个用户创建独立的数据隧道,以用户密码和token码保证数据安全,因此在使用cpolar之前,需要进行用户注册。注册过程很简单,只要在cpolar主页右上角点击用户注册,在注册页面填入必要信息,就能完成注册。
233 0
|
算法 安全 网络安全
HTTPS 的加密流程详解
详细介绍HTTPS是如何建立连接的
|
域名解析 C# 数据安全/隐私保护
阿里云域名新注、续费、转入收费政策及价格表(2023最新版价格)
阿里云的域名注册业务由万网提供接口,因此,也可以说目前阿里云是目前国内最大的域名注册商,阿里云域名价格表包括域名注册、域名续费及域名转入价格,不同时期的收费价格是不一样的,例如2022年在阿里云注册.com域名的新注价格是63元,续费是75元,到了2023年,由于各大注册商纷纷都涨价了,阿里云也涨到了69元,续费价格也上涨到了79元,下面是小编整理的2023年最新版的阿里云域名新注、续费、转入收费价格表。
11402 19
阿里云域名新注、续费、转入收费政策及价格表(2023最新版价格)
|
运维 监控 安全
特权账号管理之医疗行业篇
在数字化时代,数据库作为承载着众多关键业务系统的核心和基础,是核心业务开展过程中最具战略性的资产。同时,由于数据库系统的复杂性,决定了其存在各种管理和安全上的风险和漏洞,而这种漏洞一旦被利用,从而发生信息泄露事件,会给用户造成巨大的直接和间接损失,后果将不堪设想。
126 0
特权账号管理之医疗行业篇
|
人工智能 Java C语言
日志 | AI工程化部署
日志在任何一种语言编程中都会涉及到,python中有logging库,java中有log4j。当然C也有日志功能,一般可以用宏和函数来实现。 需要明确下日志的功能,一般会设置一个日志等级,比如trace < debug < info < warn < error < fatal 等,根据设置的等级高低来判断是否显示日志。 【1月更文挑战第1天】
218 0
|
算法 C++
(C++)三数之和--双指针法
(C++)三数之和--双指针法
107 0
|
前端开发 索引
下一篇
开通oss服务