ThreadLocal使用注意
注意 ThreadLocal 使用
2023-09-11 14:18:08 时间
ThreadLocal<T>的出现是一种空间换时间的思想的运用,是为了多线程环境下单线程内变量共享的问题。它的原理就是每个线程通过ThreadLocal.ThreadLocalMap,保存当前线程中所有ThreadLocal变量引用的key和值。相当于每个线程有各自的变量副本,线程内共享这个变量数据,线程间互不影响。
ThreadLocal<T>有它自己的使用场景,比如Spring中用它了解决Session、Connection等多线程并发访问问题,但不能它不能用来代替为了解决多线程安全问题的同步关键字,因为它实际上没有多线程间的变量共享,而线程安全问题是指多线程间变量共享,且共享变量可修改,进而可能会出现多线程并发修改共享变量的问题,这种需要通过同步手段解决。
ThreadLocal<T>变量一般要声名成static类型,即当前线程中只有一个T类型变量的实例,线程内可共享该实例数据且不会出问题,如将其声名成非static,则一个线程内就存储多个T类型变量的实例,有点存储空间的浪费,一般很少有这样的应用场景。另外根据实际情况,ThreadLocal变量声名时也多加上private final关键词表明它时类内私有、引用不可修改。
在线程池环境下,由于线程是一直运行且复用的,使用ThreadLocal<T>时会出现这个任务看到上个任务ThreadLocal变量值以及内存泄露等问题,解决方法就是在当前任务执行完后将ThreadLocal变量remove或设置为初始值,类似在Struts2 框架中Filter里的处理方法。
相关文章
- Oray.com花生壳路由器配置注意
- 电子电气架构——电子电气架构师设计架构时需要注意什么?
- 注意了!这样用 systemd 可能会有风险
- 想用Azure和AWS?Gartner提醒你注意这几点
- jsp页面用html引入vue.js注意问题
- 企业用好WMS(仓库管理系统),需要注意的几个要点
- Merge into的注意点之ORA-30926: 无法在源表中获得一组稳定的行?
- Qt 学习之路 2(19):事件的接受与忽略(当重写事件回调函数时,时刻注意是否需要通过调用父类的同名函数来确保原有实现仍能进行!有好几个例子。为什么要这么做?而不是自己去手动调用这两个函数呢?因为我们无法确认父类中的这个处理函数有没有额外的操作)
- GDAL获取投影坐标系注意问题
- 软件性能测试指标及其注意地方
- 关于在Java代码中写Sql语句需要注意的问题
- 学习笔记——类型别名、auto类型、decltype类型需要注意的一些小地方
- 工程师们注意了:有三种SDN编程语言你需要get起来
- 迁移到公有云时 这些事情一定要注意