《多线程下ThreadLocal使用场景实例》

简介: 《多线程下ThreadLocal使用场景实例》

在业务开发中,threadLocal有两种业务场景运用较多。


1、threadlocal保证每个线程独享对象,创建本地线程的副本,保证每个线程都拥有属于自己的副本,这样保证线程安全。


2、threadlocal可以作用类似全局变量,在其中一个方法里用set存入数据,其他方法可以用get直接获取,避免了传参,作用到每个线程独立保存信息。


场景一:

image.png


结果:开启了三个线程,因为用了threadlocal,每个线程都有属于自己的本地副本,并不会累加到15,而是n最大输出5。


还有就是simpledateformat也适用于场景一,当线程池开启,提交10000个或者更多任务时,每个线程都创建属于自己的simpledateformat开销会很大,而且占用内存,销毁对象也是有开销的:这种情况下,我们首先想到的是所有线程先共用一个simpledataformate,但他不是线程安全的,如何解决呢,给他加synchrolized锁,这样可以解决,但线程运行的时候,会发生阻塞,非常影响效率,此时此刻threadlocal就是非常好的解决办法。


threadlocal会让每个线程的simpledateformat独立,如果线程池Executors.newFixedThreadPool(15)开启15个线程,则只会创建15个simpledateformat,而且线程安全,相互之前不会影响。


场景二:

image.png


场景二类似于全局变量,免去了传参的麻烦 ,保证方法得到的对象值相同,先将对象存储在localthread里面,然后在获取,最后一定要记得remove掉。


问:线程池中使用threadlocal为什么容易造成内存泄漏?


因为线程池里的线程存活周期太长,往往跟程序的停止才销毁的,这样threadlocal持有的threadlocalmap就一直不会被回收,解决办法,可以手动在finally块调用它的remove()方法

相关文章
|
1月前
|
存储 Java 数据安全/隐私保护
【JUC】ThreadLocal 如何实现数据的线程隔离?
【1月更文挑战第15天】【JUC】ThreadLocal 如何实现数据的线程隔离?ThreadLocal 导致内存泄漏问题?
|
10天前
|
存储 安全 Java
深入理解Java中的ThreadLocal机制:原理、方法与使用场景解析
深入理解Java中的ThreadLocal机制:原理、方法与使用场景解析
20 2
|
1月前
|
存储 前端开发 Java
深入剖析ThreadLocal使用场景、实现原理、设计思想
深入剖析ThreadLocal使用场景、实现原理、设计思想
深入剖析ThreadLocal使用场景、实现原理、设计思想
|
1月前
|
安全 测试技术 调度
多线程03 线程安全问题以及一些简单的解决策略
多线程03 线程安全问题以及一些简单的解决策略
24 0
|
1月前
|
安全 Java 调度
【多线程】Java如何实现多线程?如何保证线程安全?如何自定义线程池?
【多线程】Java如何实现多线程?如何保证线程安全?如何自定义线程池?
216 0
|
10月前
|
安全 Java 调度
【Java|多线程与高并发】线程安全问题以及synchronized使用实例
Java多线程环境下,多个线程同时访问共享资源时可能出现的数据竞争和不一致的情况。
|
安全 Java
分析ThreadLocal如何做到单个线程独享
分析ThreadLocal如何做到单个线程独享
64 0
|
存储 缓存 Java
多线程与高并发学习:ThreadLocal源码详解
多线程与高并发学习:ThreadLocal源码详解
58 0
|
消息中间件 存储 JavaScript
ThreadLocal 搭配线程池使用造成内存泄漏的原因和解决方案
ThreadLocal 搭配线程池使用造成内存泄漏的原因和解决方案
《JUC并发编程 - 高级篇》03 - 共享对象之管程 上篇(共享带来的问题 | synchronized | 线程八锁 | 线程安全类)(二)
《JUC并发编程 - 高级篇》03 - 共享对象之管程 上篇(共享带来的问题 | synchronized | 线程八锁 | 线程安全类)
《JUC并发编程 - 高级篇》03 - 共享对象之管程 上篇(共享带来的问题 | synchronized | 线程八锁 | 线程安全类)(二)