使用threadlocal_何时以及如何使用ThreadLocal

使用threadlocal

正如我们的读者可能已经猜到的那样,我每天都会处理内存泄漏。 最近,一种特殊类型的OutOfMemoryError消息开始引起我的注意-滥用ThreadLocals引发的问题变得越来越频繁。 在查看此类泄漏的原因时,我开始相信其中一半以上是由于开发人员导致的,他们要么不知道自己在做什么,要么正试图对并非旨在解决的问题采用解决方案。 。

我决定不发表文章,而是发表两篇文章来打开这个话题,您目前正在阅读第一篇。 在帖子中,我解释了ThreadLocal使用背后的动机。 在当前正在进行的第二篇文章中,我将打开ThreadLocal帽子并查看实现。

让我们从一个虚构的场景开始,其中ThreadLocal的使用确实是合理的。 为此,请与我们的假设开发人员Tim打个招呼。 蒂姆(Tim)正在开发一个Webapp,其中包含许多本地化内容。 例如,来自加利福尼亚的用户可能希望使用熟悉的MM / dd / yy模式格式化日期,而来自爱沙尼亚的用户则希望看到根据dd.MM.yyyy格式化的日期 因此,Tim开始编写如下代码:

public String formatCurrentDate() {DateFormat df = new SimpleDateFormat("MM/dd/yy");return df.format(new Date());}public String formatFirstOfJanyary1970() {DateFormat df = new SimpleDateFormat("MM/dd/yy");return df.format(new Date(0));}

过了一会儿,Tim觉得这很无聊并且违反了良好做法–应用程序代码被此类初始化污染了。 因此,他通过将DateFormat提取到实例变量中采取了看似合理的措施。 采取行动之后,他的代码现在如下所示:

private DateFormat df = new SimpleDateFormat("MM/dd/yy");public String formatCurrentDate() {return df.format(new Date());}public String formatFirstOfJanyary1970() {return df.format(new Date(0));}

Tim对重构结果感到满意,Tim向自己扔了一个假想的高五,将更改推送到存储库中,然后回家。 几天后,用户开始抱怨–其中一些字符串似乎完全乱码,而不是以前格式正确的日期。

研究问题Tim发现DateFormat实现不是线程安全的。 这意味着在上述情况下,如果两个线程同时使用formatCurrentDate()formatFirstOfJanyary1970()方法,则状态可能会混乱,显示的结果可能会混乱。 因此,Tim通过限制对方法的访问以确保一次输入一个线程进入格式化功能来解决此问题。 现在,他的代码如下所示:

private DateFormat df = new SimpleDateFormat("MM/dd/yy");public synchronized String formatCurrentDate() {return df.format(new Date());}public synchronized String formatFirstOfJanyary1970() {return df.format(new Date(0));}

在给自己另一个虚拟的高五后,蒂姆做出了改变并去了一个漫长的假期。 第二天才开始收到电话,抱怨应用程序的吞吐量急剧下降。 深入研究问题后,他发现同步访问已在应用程序中造成了意外的瓶颈。 现在,线程不必再随意输入格式化部分了,而必须彼此等待。

进一步阅读该问题,Tim发现了另一种类型的变量ThreadLocal 。 这些变量与普通变量不同,因为每个访问一个线程(通过ThreadLocal的get或set方法)的线程都有其自己的,独立初始化的变量副本。 对于新发现的概念感到满意,Tim再次重写了代码:

public static ThreadLocal df = new ThreadLocal() {protected DateFormat initialValue() {return new SimpleDateFormat("MM/dd/yy");}};public String formatCurrentDate() {return df.get().format(new Date());}public String formatFirstOfJanyary1970() {return df.get().format(new Date(0));}

经过这样的过程,蒂姆通过痛苦的教训学到了一个强大的概念。 像在最后一个示例中那样应用后,结果可以很好地说明收益。

但是新发现的概念很危险。 如果Tim使用了应用程序类之一而不是引导类加载器加载的JDK捆绑的DateFormat类,那么我们已经处在危险区域。 只是忘记在手头的任务完成后将其删除,该对象的副本将保留在线程中,该线程通常属于线程池。 由于池化线程的寿命超过了应用程序的寿命,因此它将防止对象被垃圾回收,从而防止ClassLoader负责加载应用程序。 而且我们创建了一个泄漏,有机会以一种很好的旧java.lang.OutOfMemoryError:PermGen空间形式浮出水面。

另一种开始滥用该概念的方法是通过使用ThreadLocal作为在应用程序中获取全局上下文的黑客。 顺其自然,这是一种处理应用程序代码的可靠方法,它具有各种无法想象的依赖关系,从而将整个代码库陷入难以维护的混乱之中。

参考: 何时以及如何使用我们的JCG合作伙伴 Nikita Salnikov Tarnovski (来自Plumbr博客) 的ThreadLocal 。

翻译自: https://www.javacodegeeks.com/2013/10/when-and-how-to-use-a-threadlocal.html

使用threadlocal

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

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

相关文章

企业为什么要开通银企直联_企业为什么要做网站推广

随着现代社会的发展,如果企业不做网站推广,那么可以说是寸步难行,今天就来为大家说说企业为什么一 定要做网站推广的详情!1 、网络品牌推广做网络营销的结果就是在互联网要有自己的品牌,并且可以再网络上得到无限性的延…

在Java错误产生之前对其进行处理的新方法

我们如何认识到解决预生产错误的旧方法还不够,以及我们如何能够改变这种情况 第一次尝试时就没有完美的代码,我们所有人都可以证明我们已经学到了很难的方法。 不管我们使用多少测试周期,代码审查或工具,总有至少一个偷偷摸摸的错…

学术诚信的重要性_申论作文开头之诚信

本段是经典开头或过渡段落写作,通过反面论证引出总论点重要性,结构清晰,层次感强,本段可以适用于公民道德与诚信建设问题、食品安全问题、环境污染等等,其中影响及重要性分析语句可以用于申论作文的开头部分&#xff0…

curl 访问不到html_嵌入式工程师入门前后端系列1:访问一个网页

做为嵌入式行业的从业者,最近经常听到PAAS,SAAS等和”云”相关的概念,被整的一头雾水。很多时候咱们的物联网硬件设备都会有一个云平台,用于设备管理或者UI应用展示等功能,这通常是由专门的前后端工程师配合美工一起完…

java:8最小镜像_Java:本地最小语言

java:8最小镜像在1996年至2002年之间,我用Java编写了成千上万行代码。我用Java 1.0到Java 1.4编写了Web框架,电子表格以及更多内容。 与90年代中期(预模板)的C 相比,Java是一种完全令人惊奇的语言。 JVM是所有计算机语…

seaborn无法import_无法导入seaborn

我在进口seaborn时有问题。我最近在我的电脑上安装了“Python”,并尝试使用seaborn pacjesge。我更新了scipy和{}。实际上,在更新scipy之前,python看不到{}。问题是什么?请帮帮我Python 2.7.10 |Anaconda 2.3.0 (64-bit)| (defaul…

project子项目之间任务关联_project项目任务类型,就这么简单

任务是Project中最重要的概念之一,它是组成项目的基本元素。在Project项目管理软件中,任务的类型被分为三类,它们分别是固定单位任务,固定工期任务和固定工时任务。对这些任务类型的认识和了解,项目团队可以充分的协调…

邪恶的Java技巧使JVM忘记检查异常

我长期以来一直批评Java中的编译器检查异常机制。 无论您是爱还是恨,都可以肯定一件事:在某些情况下,您不想与他们打交道。 Java中的解决方案是将一个检查过的异常包装在new RuntimeException(e)但这可以提供较长的堆栈跟踪,而无需…

盲僧一键r闪用什么设置_美加狮R.A.T. PRO X3至尊版带你畅玩模拟飞行

很多模拟飞行或者皇牌空战的玩家们都追求在游戏过程中的真实驾驶体验,渴望通过游戏来实现自己的飞行梦。但普通鼠标的左右键及滚轮并不能带给玩家逼真的体验,美加狮全新发布的鼠标R.A.T. PRO X3至尊版却可以做到。美加狮R.A.T. PRO X3至尊版是美加狮全新…

input标签的值只能两位小数_Day51 HTML表格表单标签、flask框架

目录表格标签表单标签action标签input标签select标签textarea标签form表单提交文件需要注意flask框架1、表格标签<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>表格标签</title><meta name…

maven检测依赖_检测Maven依赖中介

maven检测依赖从Maven 2.0.9开始&#xff0c;已向Maven添加了一个称为依赖中介的新功能。 依赖关系中介是Maven在特定情况下在依赖关系树中多次出现依赖关系时用来解决项目依赖关系的技术。 通常&#xff0c;这发生在通过项目的依赖关系链接的传递依赖关系上。 在这些情况下&am…

webservice 参数太大_手把手系列:常用数据交换方案Web Service接口处理法

手把手系列&#xff1a;常用数据交换方案之Web Service接口处理法Web Service是一个SOA(面向服务的编程)的架构&#xff0c;是一个平台独立的&#xff0c;低耦合的&#xff0c;基于可编程的web的应用程序&#xff0c;可使用开放的XML标准来描述、发布、发现、协调和配置这些应用…

在事务外自动保存托管JPA实体

Spring中的存储库和事务并存。 Spring中的所有数据库访问都应在事务内运行&#xff0c;并且通常在某个地方使用Transactional来强制执行此操作。 但是&#xff0c;这并非总是必要的。 例如&#xff0c;当使用Spring Data时&#xff0c;您的存储库使用SimpleJPARepository来实现…

点击事件为什么会失效_Spring事务原理?事务在方法间如何传播?为什么会失效?...

推荐学习疯狂膜拜&#xff01;阿里出品Spring Security王者晋级文档肝了十天半月&#xff0c;献上纯手绘“Spring/Cloud/Boot/MVC”全家桶脑图前言事务我们都知道是什么&#xff0c;而Spring事务就是在数据库之上利用AOP提供声明式事务和编程式事务帮助我们简化开发&#xff0c…

wcdma系统随机接入过程的流程图_招聘电信协优初中级优化工程师、联通系统高级...

点击上方“通信人才网” 订阅&#xff01;招聘岗位招聘职位&#xff1a; 电信协优初中级优化工程师岗位类型&#xff1a;5G无线网络优化,4G-LTE无线网络优化,无线网优项目负责人,DT/CQT测试与分析,2G/3G无线网络优化工作地点&#xff1a; 西宁市,果洛藏族自治州,海南藏族自治州…

基于wincc的虚拟电梯设计_一文带你了解西门子整个虚拟调试与仿真软硬件体系...

写在面前大家好&#xff0c;我是小智&#xff0c;智能制造之家号主~经常有朋友关注到PLCSIM、SIMIT、Amesim、NX MCD、 Process Simulate、Plant Simulation等&#xff0c;但都不知道它们到底做啥的~因此今天对西门子仿真与虚拟调试进行整体介绍&#xff0c;力求让小白也能熟悉…

jedis使用 api_通过Jedis API使用排序集

jedis使用 api在上一篇文章中&#xff0c;我们开始研究Jedis API和Java Redis Client。 在这篇文章中&#xff0c;我们将研究Sorted Set&#xff08;zsets&#xff09;。 Sorted Set的工作方式类似于Set&#xff0c;它不允许重复的值。 最大的区别是&#xff0c;在“排序集”中…

三星ml1660拆机图解_炫龙DD2拆机,高性能的背后是怎样的面容?

双内存插槽 如标题所说&#xff0c;今天为大家带来炫龙DD2的图解拆机&#xff0c;废话少说&#xff0c;直接进入主题吧&#xff01;笔者对炫龙毁灭者DD2进行了简单拆解&#xff0c;拆解方式为打开D壳&#xff0c;查看散热模组和各部分硬件。炫龙毁灭者DD2延续了品牌一贯传统&am…

jwt-cli:一个用于解码JSON Web令牌(JWT令牌)的Shell库

当我开始经常需要解码JSON Web令牌时&#xff0c;我感到迫切需要编写允许我快速进行操作的程序。 有很多不错的选项&#xff0c;例如jwt.io &#xff0c;但是一旦您需要执行此操作&#xff0c;它通常就会变得笨拙。 而且&#xff0c;如果您需要处理多个令牌或进一步处理输出&am…

目录页码错误未定义书签怎么解决_目录页码对不齐应该怎么办?这2种方法,工作效率大增...

在制作文档目录时&#xff0c;你有没有遇到下图情况&#xff1a;右侧页码不对齐或者左侧文本不对齐&#xff0c;你一般是如何处理的&#xff0c;与大家分享相关的2种解决办法。工作效率大增&#xff01;1、目录页码不对齐该怎么办&#xff1f;遇到这种情况&#xff0c;一般是制…