threadlocals

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

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

您可以将任何对象设置为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

threadlocals_如何使用ThreadLocals射击自己相关推荐

  1. 如何用ThreadLocals射击自己

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

  2. Unity空间射击游戏开发教程

    描述 在本课程中,您将学习如何在unity中制作一款太空射击游戏.本课程使用全新的特性和编码实践,并且兼容所有较新版本的unity. 了解如何使用世界领先的免费游戏开发工具Unity创建太空射击游戏. ...

  3. UE4创建第一人称射击游戏学习教程

    Unreal Engine 4: Create Your Own First-Person Shooter MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz,2 Ch 语言 ...

  4. UE4创建第一人称射击游戏学习教程 Unreal Engine 4: Create Your Own First-Person Shooter

    UE4创建第一人称射击游戏学习教程 本课程包含38节视频课,将逐步指导您完成以下主题: 云桥网络 平台获取课程! 如何创建6种可定制的武器(包括手枪.突击步枪.猎枪.狙击枪.榴弹发射器和火箭发射器) ...

  5. 贪心:Burst Balloons 最少次数完成射击气球

    已知在一个平面上有一定数量的气球,平面可以看作一个坐标系,在平面的x轴的不同位 置安排弓箭手向y轴方向射箭,弓箭可以向y轴走无穷远;给定气球的宽度 xstart ≤ x ≤ xend,问至少需要多少弓 ...

  6. 用javascript实现的纵版飞行射击游戏—《天机》

    花了一个半月的时间用javascript完成了这款web版飞行射击游戏,游戏效果接近一般的客户端游戏,不过对机器的要求稍微高点点,主要是CPU,最好在1.5GHZ以上,不然可能会比较卡,支持IE.FF ...

  7. 【初阶】unity3d官方案例_太空射击SpacingShooter 学习笔记 显示分数时,如何让函数之间相互交流...

    [初阶]unity3d官方案例_太空射击SpacingShooter 学习笔记 显示分数时,如何让函数之间相互交流 一.关于 显示分数时,如何让函数之间相互交流 这是一个非常好的逻辑问题 1 思路:主 ...

  8. [安卓] 12、开源一个基于SurfaceView的飞行射击类小游戏

    前言  这款安卓小游戏是基于SurfaceView的飞行射击类游戏,采用Java来写,没有采用游戏引擎,注释详细,条理比较清晰,适合初学者了解游戏状态转化自动机和一些继承与封装的技巧. 效果展示    ...

  9. 打靶归来——记参加射击比赛感想

    2019独角兽企业重金招聘Python工程师标准>>> 打靶归来 --记参加射击比赛感想 实弹射击是所有军训项目中我最期待的一项,更令我感到兴奋和荣幸的是我竟能成为连里六个参加射击比 ...

最新文章

  1. TCC分布式事务的实现原理
  2. TIANCHI天池-OGeek算法挑战赛-完整方案及代码(亚军)
  3. linux设备模型,bus,device,driver,实验遇到的问题
  4. Reflect.ownKeys
  5. 查看oracle压力,一个很简单测试oracle压力方法
  6. android 字典转json,在Swift中将字典转换为JSON
  7. SAP License:SAP货币转换
  8. python和前端(三)JS的激情
  9. Arduino IDE 1.0以上LiquidCrystal_I2C驱动
  10. 【历史上的今天】4 月 4 日:互联网新时代的缔造者出现;微软成立;苹果公司元老诞生
  11. 几何图形变化(Codevember)
  12. Java中将汉语转成拼音的方法
  13. m2e-wtp的作用
  14. 【最优化问题】方法总结
  15. html文本框背景text怎么变透明,css怎么设置背景图片透明文字不透明?
  16. IP广播无法登陆服务器系统,IP广播服务器软件(加密狗)SPR-03WJ
  17. LSTM的loss和accuracy近乎不变问题
  18. G6展示网络拓扑图,适配大数据量的方案
  19. 【状语从句练习题】since 的时态问题
  20. 运维面试精选:1、史上最详细的Nginx、LVS、HAProxy负载均衡精选面试题

热门文章

  1. 跟我学 Java 8 新特性之 Stream 流(六)收集
  2. 探究Java File类中list()、listFiles()的使用及区别,认识和使用匿名内部类
  3. 关于Icon,Image,ImageIcon的简单的对比参考 上篇
  4. Oracle入门(十四.20)之创建DML触发器:第一部分
  5. 【Java】jdk和eclipse下载安装
  6. java面向对象高级分层实例_数据库操作类
  7. php类常量的特点,php类常量是什么?类常量用法详解
  8. matlab盒子分形维数_分形:盒子维数
  9. java文件端点续传效果图_Java单依赖性Dockerized HTTP端点
  10. spring http缓存_HTTP缓存与Spring示例