iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >不规范使用ThreadLocal导致bug如何解决
  • 424
分享到

不规范使用ThreadLocal导致bug如何解决

2023-07-04 23:07:46 424人浏览 薄情痞子
摘要

这篇文章主要讲解了“不规范使用ThreadLocal导致bug如何解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“不规范使用ThreadLocal导致bug如何解决”吧!因为线程重用导致的

这篇文章主要讲解了“不规范使用ThreadLocal导致bug如何解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“不规范使用ThreadLocal导致bug如何解决”吧!

因为线程重用导致的信息错乱的bug

ThreadLocal一般用于线程间的数据隔离,通过将数据缓存在ThreadLocal中,可以极大的提升性能。但是,如果错误的使用Threadlocal,可能会引起不可预期的bug,以及造成内存泄露。

有时我们会在一个接口中缓存某些数据到ThreadLocal中,但是我们要意识到,处理请求的这些线程是由Tomcat提供的,而tomcat提供的线程都是配置在一个线程池中的。

也就是说,线程是可能被重用的,如果线程一旦被重用,而ThreadLocal的数据没有及时重置,就会导致数据被混乱使用。

以下方的接口为例,先获取当前线程中保存的数据信息,将参数中的name保存到ThreadLocal中以后,再获取一次。

@GetMapping(value = "/threadLocal")public ResponseEntity<Object> threadLocal(String name) {  String before = Thread.currentThread().getName() + ":" + threadLocal.get();  //先获取值,理论上应该是null  System.out.println("before:" + before);  threadLocal.set(name);  String after = Thread.currentThread().getName() + ":" + threadLocal.get();  //设置完参数值再获取一次  System.out.println("after:" + after);  return ResponseEntity.ok().build();}

为了尽快复现线程重用导致的问题,我们将servlet.tomcat.threads.max设置为1,这样每次请求使用的都是同一个线程。

不规范使用ThreadLocal导致bug如何解决

第一次请求接口,数据看起来很正常:

不规范使用ThreadLocal导致bug如何解决

但是第二次请求接口时,可以看到线程仍然是Http-NIO-8080-exec-1,但是before却打印出了第一次请求的参数test。

不规范使用ThreadLocal导致bug如何解决

这就是因为没有及时重置ThreadLocal导致的数据错误。

正确使用的姿势

修正的办法就是处理完接口之后要及时清理ThreadLocal。

@GetMapping(value = "/threadLocal")public ResponseEntity<Object> threadLocal(String name) {  try {    String before = Thread.currentThread().getName() + ":" + threadLocal.get();    //先获取值,理论上应该是null    System.out.println("before:" + before);    threadLocal.set(name);    String after = Thread.currentThread().getName() + ":" + threadLocal.get();    //设置完参数值再获取一次    System.out.println("after:" + after);  } finally {    //清理数据    threadLocal.remove();  }  return ResponseEntity.ok().build();}

更优雅的处理方式

可能也有的朋友会说,每次都要使用try finally处理线程数据,未免也太麻烦了。其实,我们可以使用拦截器或者过滤器自动帮我们完成数据的初始化以及清理工作。

不规范使用ThreadLocal导致bug如何解决

感谢各位的阅读,以上就是“不规范使用ThreadLocal导致bug如何解决”的内容了,经过本文的学习后,相信大家对不规范使用ThreadLocal导致bug如何解决这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: 不规范使用ThreadLocal导致bug如何解决

本文链接: https://www.lsjlt.com/news/348175.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 不规范使用ThreadLocal导致bug如何解决
    这篇文章主要讲解了“不规范使用ThreadLocal导致bug如何解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“不规范使用ThreadLocal导致bug如何解决”吧!因为线程重用导致的...
    99+
    2023-07-04
  • 不规范使用ThreadLocal导致bug分析解决
    目录因为线程重用导致的信息错乱的bug正确使用的姿势更优雅的处理方式最后因为线程重用导致的信息错乱的bug ThreadLocal一般用于线程间的数据隔离,通过将数据缓存在Thre...
    99+
    2023-01-08
    ThreadLocal bug解决分析 ThreadLocal bug
  • 滥用@PathVariable导致出现bug如何解决
    这篇“滥用@PathVariable导致出现bug如何解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“滥用@PathVar...
    99+
    2023-07-04
  • win11导致office不可用如何解决
    本篇内容介绍了“win11导致office不可用如何解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!方法一: 如果我们使用的是正版offi...
    99+
    2023-07-01
  • redis使用不当导致应用卡死bug的过程解析
    目录topjstack 查看堆内存执行thread命令 首先说下问题现象:内网sandbox环境API持续1周出现应用卡死,所有api无响应现象 刚开始当测试抱怨环境响应慢...
    99+
    2024-04-02
  • Spring中使用自定义ThreadLocal存储导致的坑及解决
    目录Spring自定义ThreadLocal存储导致的坑一个容易想到的实现办法是使用ThreadLocalThreadlocal可能会产生内存泄露的问题及原理为什么会产生内存泄露?J...
    99+
    2024-04-02
  • redis使用不当导致应用卡死bug怎么办
    这篇文章主要介绍redis使用不当导致应用卡死bug怎么办,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!首先说下问题现象:内网sandbox环境API持续1周出现应用卡死,所有api无响应现象刚开始当测试抱怨环境响应...
    99+
    2023-06-20
  • Spring中使用自定义ThreadLocal存储导致的坑怎么解决
    这篇文章主要介绍了Spring中使用自定义ThreadLocal存储导致的坑怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Spring中使用自定义ThreadLocal...
    99+
    2024-04-02
  • sqlserver标识规范不能改如何解决
    如果SQL Server标识规范不能改变,但是需要解决某个问题,可以考虑以下解决方案: 使用其他方式生成唯一标识:可以使用GUI...
    99+
    2024-04-09
    sqlserver
  • 解决javaBean规范导致json传参首字母大写将永远获取不到问题
    javaBean规范导致json传参首字母大写获取不到 规范中另一个特别的地方就是: 1.第二个字母为大写的属性名要区别对待 如果属性名的第二个字母是大写的,那么该属性名直接用作 g...
    99+
    2024-04-02
  • Spring中使用自定义ThreadLocal存储导致的坑及解决方法是什么
    本篇文章为大家展示了Spring中使用自定义ThreadLocal存储导致的坑及解决方法是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Spring自定义ThreadLocal存储导致的坑Spr...
    99+
    2023-06-21
  • 因Redis使用不当导致应用卡死Bug的过程是怎样的
    这篇文章给大家介绍因Redis使用不当导致应用卡死Bug的过程是怎样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。首先说下问题现象:内网sandbox环境API持续1周出现应用卡死,...
    99+
    2024-04-02
  • php原因导致cpu100%如何解决
    本篇内容介绍了“php原因导致cpu100%如何解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!php原因导致cpu100%的解决办法:1...
    99+
    2023-07-04
  • 如何解决Mybatis导致的问题
    本篇内容介绍了“如何解决Mybatis导致的问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!背景前段时间...
    99+
    2024-04-02
  • 如何解决springmvc不进入Controller导致404的问题
    这篇文章主要为大家展示了“如何解决springmvc不进入Controller导致404的问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何解决springmvc不进入Controller导...
    99+
    2023-06-29
  • CSS如何使用BEM命名规范
    这篇文章将为大家详细讲解有关CSS如何使用BEM命名规范,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。BEM(块,元素,修饰符)是基于组件的Web开发的一种前端命名方法论,主要针对CSS。其背后的想法是将...
    99+
    2023-06-08
  • 如何解决git config坑的导致CI校验不通过
    如何解决git config坑的导致CI校验不通过,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。事故由来当我把bug解决休掉后,顺利跑通后...
    99+
    2024-04-02
  • java内存异常使用导致full gc频繁如何解决
    这篇文章主要介绍了java内存异常使用导致full gc频繁如何解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇java内存异常使用导致full gc频繁如何解决文章都会有所收获,下面我们...
    99+
    2023-07-06
  • 如何使用zoom解决IE6 margin无效BUG
    本篇文章为大家展示了如何使用zoom解决IE6 margin无效BUG,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。 IE6 marg...
    99+
    2024-04-02
  • 如何使用eslint和editorconfig规范代码
    这篇文章主要为大家展示了“如何使用eslint和editorconfig规范代码”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用eslint和editor...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作