ThreadLocal 可能踩到的坑
背景
- 首先ThreadLocal 不做太多的介绍,在多线程场景下有着广泛的应用。
- 最近在实现OneLog方法级日志的时候,使用了 ThreadLocal 作为缓存和计数器,在调试过程中,发现有一些场景会出现数据错乱和内存溢出的问题。
详情
- OneLog方法级日志使用 ThreadLocal 有两个场景,一个是将方法入参信息缓存起来,然后在方法结束之后与返回结果进行组装。另一个是作为计数器使用,保证循环方法的场景下,不会打印太多的日志。
- 实际使用的时候发现了问题,ThreadLocal 对象的生命周期是依赖于线程的,那么对于一个web应用来说,tomcat的线程是循环使用的,也就是说在web应用中,主线程下 ThreadLocal 对象永远不会被回收!
- 下面是问题复现示例代码:
@Controller
public class TestThrea

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
不学无数——Java中IO和NIO
JAVA中的I/O和NIO I/O 问题是任何编程语言都无法回避的问题,可以说 I/O 问题是整个人机交互的核心问题,因为 I/O 是机器获取和交换信息的主要渠道。在当今这个数据大爆炸时代,I/O 问题尤其突出,很容易成为一个性能瓶颈。 什么是I/O I/O ? 或者输入/输出 ? 指的是计算机与外部世界或者一个程序与计算机的其余部分的之间的接口。它对于任何计算机系统都非常关键,因而所有 I/O 的主体实际上是内置在操作系统中的。单独的程序一般是让系统为它们完成大部分的工作。 I:就是从硬盘将内容读取到内存中 O:就是从内存将内容读取到硬盘中 Java中的I/O操作类在包java.io下面,大概将近有80多个类,但是这些类可以分为三组 基于字节操作的I/O接口:InputStream和OutputStream 基于字符操作的 I/O 接口:Writer 和 Reader 基于磁盘操作的 I/O 接口:File 然后在各个接口下还有其各自的包装类,其运用到了装饰模式,为其增加一些功能,而Java的I/O复杂也在这,不同的装饰模式创建类的代码也不同。 基于字节操作 InputStream的...
-
下一篇
java写爬虫获取京东售价
在互联网这个圈子,每每说起爬虫,大家总是会说起python , 但是除了python , 我们用Java也是可以完成的。最近生活比较拮据,买东西总想买凑一波打折,在现在生活中, 我们可以一家超市一家超市的跑, 然后看哪家最便宜,但习惯网购的我们,可能更多的会选择打开淘宝或者京东看看。但并不是每次都凑巧想要的东西都在打折,那我们就会不停的去刷新页面,看看有没有打折,有没有降价。 如以前几篇文章所说,人力能在电脑上完成的,计算机也一定可以帮我们完成。今天就来试一下,用java程序来帮我们进行价格的监控。 思路: 我们是通过打开浏览器,然后输入京东的官网,找到自己想要的东西,然后看价格。发现不是自己想要的价格就先放那,过段时间再来刷新一次。 那用程序来做也是这么一个思路。 打开京东的网址,然后去找到价格,看看是不是我们想要的价格。 技术选型:承接上文的maven项目,我们用Jdk10自带的HttpClient去模拟浏览器的请求。用jsoup去分析html页面(需要引入jsoup的pom依赖)。 在页面上人工获取价格的方式如下图所示: image.png 在pom.xml的 dependenc...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- MySQL数据库在高并发下的优化方案
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS8编译安装MySQL8.0.19
- Dcoker安装(在线仓库),最新的服务器搭配容器使用