threadlocals_如何使用ThreadLocals射击自己

threadlocals

它将很好地启动。 像大多数故事一样。 您会发现一个新概念,并对其功能感到惊讶。 然后突然装备了这把新锤子,一切开始看起来像钉子。 根据我们过去几个月的经验, java.lang.ThreadLocal真是一锤定音。

我想这全都归结为ThreadLocal的工作原理。 通过范围界定类推最容易理解这个概念。 以同样的方式,您的Spring Bean可以处于容器,会话或请求范围内。 ThreadLocal使您可以在Thread范围内声明对象。

Shoot 您可以将任何对象设置为ThreadLocal,并且该对象在访问该对象的线程中将具有全局作用域和局部作用域。 一开始可能很难理解,但让我解释一下:

  • ThreadLocal可以全局访问存储在ThreadLocal中的值。 这意味着,如果您可以访问代码中的ThreadLocal引用,则可以从该线程内部的任何位置访问其中存储的值。 如果线程从多个类调用方法,则所有方法都可以看到其他方法设置的ThreadLocal变量(因为它们在同一线程中执行)。 该值无需显式传递。 就像使用全局变量一样。
  • 存储在ThreadLocal中的值是线程本地的,这意味着每个线程将拥有自己的ThreadLocal变量。 线程无法访问/修改其他线程的ThreadLocal变量。

因此,在这里我们有理由庆祝–我们掌握着一个真正强大的概念。 通常,这是呈现有状态类线程安全的最简单方法。 并封装非线程安全类,以便可以在多线程环境中安全地使用它们。 除了简单之外,使用ThreadLocal存储每个线程单个信息或每个线程上下文信息还包含有价值的信息–通过使用ThreadLocal ,很明显,线程之间不共享存储在ThreadLocal中的对象,从而简化了任务确定类是否是线程安全的。 当您手头有1,000,000行的代码库时,我们发现这并非易事。

另一方面,这个强大的概念在错误的手中会产生许多问题。 像其他任何滥用的设计概念一样。 在过去的几个月中,我们最经常遇到两个问题:

  • ThreadLocal使您可以使用变量,而无需将它们显式传递给方法调用链。 在某些情况下可能有用。 但是你们那里创建了n层体系结构以抽象出不同的通信接口的人们。 然后从您的DAO对象中的ThreadLocals中获取HttpServletRequest ……您在做这个决定时在吸烟吗? 我们在研究这个特殊案例时花了几个小时和第二双眼睛。 但是无论如何-使用全球化的力量时要小心。 您最终在代码中创建了意外的依赖关系。 您可能还记得–这不是明智的选择。
  • 使用ThreadLocal时,很容易在代码中引入内存泄漏。 这很好地说明了类加载器周围的复杂性。 如果要在应用程序服务器中部署代码,则使用与应用程序服务器本身使用的类加载器不同的类加载器来加载/卸载应用程序类。 这本身还不错。 但是,现在考虑到现代应用程序服务器也池化线程,而不是在每个HttpRequest上创建一个新线程,我们为问题奠定了基础。

如果其中一个应用程序类将一个值存储在ThreadLocal变量中,并且在完成手头的任务之后没有将其删除,则该Object的副本将与Thread一起保留(来自应用程序服务器线程池)。 由于池化线程的寿命超过了应用程序的寿命,因此它将防止对象被垃圾回收,从而防止ClassLoader负责加载应用程序。 而且我们创建了一个泄漏,有机会以一种很好的旧java.lang.OutOfMemoryError:PermGen空间形式浮出水面。

因此,考虑到它可能造成的危害,我们应该避免使用ThreadLocal吗? 约书亚·布洛赫(Joshua Bloch)十年前曾说过:

“您是否可以通过线程局部变量导致意外的对象保留? 你当然可以。 但是您也可以使用数组来执行此操作。 这并不意味着线程局部变量(或数组)是坏事。 只是您必须谨慎使用它们。 使用线程池需要格外小心。 随意使用线程池与随意使用线程局部变量可能会导致意外的对象保留,这在许多地方都已提到。 但是,将责任归咎于线程本机是没有根据的。”

我倾向于同意布洛赫先生的观点,并且不认为ThreadLocal是邪恶的创造。 但是我也确实认为这是许多人无法正确理解的概念。

本文的灵感主要收集在寻找一些令人讨厌的错误的不眠之夜中。 但是在写作时,以下资源也被证明是有益的:

  • Veera Sundar 博客文章解释了范围界定
  • Javin Paul关于ThreadLocal泄漏的摘要
  • 约书亚·布洛赫(Joshua Bloch)对ThreadLocals的看法

参考: 如何与我们的JCG合作伙伴 Nikita Salnikov Tarnovski (来自Plumbr Blog博客) 一起使用ThreadLocals进行射击 。

翻译自: https://www.javacodegeeks.com/2013/01/how-to-shoot-yourself-in-foot-with-threadlocals.html

threadlocals

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/349624.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASP.NET Core Web API

1.简单介绍 ASP.NET Core Web API 是 ASP.NET Core MVC 的一个功能。ASP.NET Core MVC 包含了对 Web API 的支持。可以构建多种客户端的 HTTP 服务。ASP.NET Core Web API可用于在 .NET Core 上构建 RESTful 应用程序。 框架包含对 HTTP 内容协商的支持,内置支持以 …

win8配置_《FIFA 20》PC配置公布 最低仅需i3+GTX660

EA公布了新作《FIFA 20》的PC配置需求,玩家最低仅需 i3-2100 GTX 660 显卡即可进行游戏,推荐配置则为 i3-6300T GTX 670 显卡,考虑到本作的逼真画面效果,这配置可以说是非常亲民,另外硬盘空间需要大约 50 GB。最低配…

Thymeleaf + Spring中的验证

总览 我们将要讨论的重要主题涉及空值,空字符串和输入验证,因此我们不会在数据库中输入无效数据。 在处理空值时,我们使用了Java 1.8中引入的java.util.Optional 。 0 – Spring Boot Thymeleaf示例表单验证应用程序 我们正在为一所大学构…

技术管理规划-设定团队的职能

背景 职责 团队是干什么的 初步自查团队 1.公司为什么给我团队?希望我产出什么?完成对除了c端健康领域探索的研发任务,产出技术类产品 2.团队存在的独特价值是什么?研发过lx健康这款基础app,研发能力强,熟悉硬件相关技…

开发转测试没人要_前端开发,测试,后端,该如何选择?

一般来说前端会比后端简单一些的,初学者或者转行可能考虑前端多一点,但是后端开发的薪水又比前端高一些,就是比较枯燥。前端开发我目前一直在自学前端,从网上找资料,然后听课,只要是对编程有兴趣&#xff0…

技术管理规划-如何设定团队的目标

团队管理规划有4个互相关联的要素: 职能目标团队路径在未来的3个月,6个月,1年,2年,3年,5年中,你希望带着你的团队抵达一个什么样的目的地,也就是团队的目标。 更加清楚目标意味着什么…

a8处理器相当于骁龙几_天玑820相当于骁龙什么处理器?天梯图秒懂联发科天玑820性能排名...

5月18日,联发科发布了全新 天玑820处理器,号称目前最强中端芯,受到不少网友关注。联发科近年来在手机CPU市场沉寂多年,今年异常给力,先后发布了天玑1000/L、天玑800等多款处理器,采用了全新的命名方式&…

hibernate 继承_Hibernate继承:每个类层次结构的表

hibernate 继承在本教程中,我们将了解如何在hibernate中实现继承。可以通过3种方式在hibernate中实现继承。在本文中,我们将看到其中一种,即每个类层次结构一个表。 Hibernate中的继承: Java是面向对象的语言,继承是J…

vue - cli 脚手架安装

一、 node安装 1)如果不确定自己是否安装了node,可以在命令行工具内执行: node -v (检查一下 版本); 2)如果 执行结果显示: xx 不是内部命令,说明你还没有安装node , node 安装地址…

python人工智能_人工智能福利丨Python核心语法实战

Python已正式跻身成熟语言行列,成为整个互联网的基础性语言之一,并以肉眼可见的速度,在全球攻城略地:——牢牢占据TIOBE世界编程语言排行榜第四名,且保持上升趋势——国家级人工智能四大平台确立——正式纳入全国计算机…

.NET Core 单元测试

应用程序测试的类型很多,包括集成测试,Web 测试,负载测试等。在最底层的是单元测试,此测试可以测试单个软件组件或方法。单元测试一般只测试开发人员的代码,不应该测试基础结构普、问题,如数据库&#xff0…

是什么原因导致OutOfMemoryError?

发生以下情况之一时,可能会引发OutOfMemoryError : JVM耗尽了本机内存 Java堆内存不足 PermGen或Metaspace内存不足 JVM花太多时间试图收集垃圾 通常可以从错误消息中OutOfMemoryError出OutOfMemoryError的根本原因。 让我们研究每种情况的细节。 …

win10电脑开机密码忘了怎么办_Mac电脑忘记开机密码怎么办?Mac开机密码快速恢复方法...

Mac忘记开机密码怎么办?虽然小编觉得大多数人应该都不会Mac忘记开机密码,但是如果真的有人忘记了怎么办呢?小编这里教你们一种方法,可以帮你1分钟快速恢复Mac电脑忘记开机密码,感兴趣的朋友快跟着小编一起来看看吧&…

技术管理规划-如何规划团队的架构

管理规划的4个要素 1.职能【清楚自己团队的基本职责和使命】 2.目标【为团队设定清晰的目标】 3.团队【团队的架构规划】 4.路径 团队目标 根据团队目标去梳理团队 团队目标: 某个时间节点,团队发展成什么状态。 要点说明规模实际人数和预算人数分工团队…

win10家庭版调出组策略_利用powershell为win10家庭版安装组策略

虽然win10家庭版阉割了组策略管理器,但至少到1607版本时还可以用cmd脚本安装它。可是随后win10更新了几个大版本,不知为何,cmd控制台常常会有诡异的Bug,导致无法用老办法安装组策略管理器。为了彻底解决这个问题,不妨另…

Spring批处理CSV处理

总览 我们将讨论的主题包括使用Spring Batch进行批处理的基本概念,以及如何将数据从CSV导入数据库。 0 – Spring Batch CSV处理示例应用程序 我们正在构建一个应用程序,该应用程序演示Spring Batch处理CSV文件的基础。 我们的演示应用程序将允许我们处…

NOIP模拟测试28「阴阳·虎·山洞」

写这几个题解我觉得我就像在按照官方题解抄一样 阴阳 题解 将题目中给的阴阳看作黑色和白色 首先我们观察到最后生成图中某种颜色必须是竖着单调递增或竖着单调递减 类似这样 否则不满足这个条件 但合法染色方案必须满足任意两个同颜色格子之间的格子也必须是该颜色。 然后我们…

linux设置环境变量_什么是linux环境变量

本来这篇文章好几天之前就写好了,但是媳妇儿跟我说工作日就不要发了,大家都在上班,哪有闲心思看你的文章。哎,可能大家用头条都是在放松刷娱乐,看小姐姐。所以就一直拖到现在。周末了,更是放松的好时候&…

理科卷math·english·chinese·biology·chemistry·physics

一套比一套炸,果然我只会做B卷,虽然我B也很差但没差到这种地步 $math$ 题解 看似没法做但总会有突破口 $70\%$ 发现和小凯的诱惑很像,于是看$gcd$是否为$1$只要为$1$可以凑齐所有数 $n^2$枚举两两$gcd$ $80\%$ 我考试时思路 找到每一个数和$mod$的$gcd$,发现只要是任一$gcd$倍数…

cad卸载_怎么把CAD卸载干净,老司机来教你

CAD经常出现文件丢失啊、这样那样的提示,要是身边有个大神级朋友还好,没有的小盆友只能乖乖的卸载,重新安装了,那么又有个问题拦住我们了——怎么把CAD卸载干净呢?由于卸载不干净,再次安装CAD时&#xff0c…