ThreadLocal

ThreadLocal是Java中用于实现线程局部变量的类,它为每个线程提供独立的变量副本,确保数据隔离,避免线程安全问题。在Spring事务管理中,ThreadLocal被用来绑定每个线程的JDBC连接,实现事务的隔离性。然而,ThreadLocal的弱引用可能导致内存泄露,需要合理使用和清理。最佳实践是在使用前后调用remove方法,并在异常处理中确保清理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作用

通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。如果想实现每一个线程都有自己的专属本地变量该如何解决呢? JDK 中提供的ThreadLocal类正是为了解决这样的问题。 ThreadLocal类主要解决的就是让每个线程绑定自己的值,可以将ThreadLocal类形象的比喻成存放数据的盒子,盒子中可以存储每个线程的私有数据。

如果你创建了一个ThreadLocal变量,那么访问这个变量的每个线程都会有这个变量的本地副本,这也是ThreadLocal变量名的由来。他们可以使用 get() 和 set() 方法来获取默认值或将其值更改为当前线程所存的副本的值,从而避免了线程安全问题。

ThreadLocal是一个线程本地变量,作用主要是做数据隔离

ThreadLocal中填充的数据只属于当前线程,变量的数据对别的线程而言是相对隔离的,每个线程维护自己的变量副本,多个线程互相不可见,因此多线程操作该变量不必加锁,适合不同线程使用不同变量值的场景;

应用场景----spring 事务

一个数据库对应n个线程,一个线程对应一个事务Spring框架在【事务】开始时会给【当前线程】绑定一个JDBC Connection,整个事务过程都是使用该线程绑定的connection来执行数据库操作,实现了事务的隔离性

事务隔离级别:读未提交,读已提交,可重复读,串行化

spring 事务主要是 ThreadLocal 和 AOP(切面编程) 实现的;

ThreadLocalMap的【弱引用】及其引起的【内存泄露】,实际上,ThreadLocal内部已经为我们做了一定的防止内存泄漏的工作,如调用expungeStaleEntry()方法;

事务包中 TransactionSynchronizationManager 的源码如下:

ThreadLocal应用最佳实践

  • 在ThreadLocal使用前后都调用remove清理,同时对异常情况也要在finally中清理
  • ThreadLocal一般加static修饰,如果ThreadLocal不加static,则每次其所在类实例化时,都会有重复ThreadLocal创建。这样即使线程在访问时不出现错误也有资源浪费;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值