ThreadLocal的概念和底层实现

概念

ThreadLocal 是一个线程局部变量,同一个 ThreadLocal 所包含的对象在不同的 Thread 中都会对应不同的副本,所以,对于线程 Thread 来说,都有自己的 ThreadLocal,对于其他线程不可见。

作用

做数据隔离,填充的数据只属于当前线程,变量的数据对别的线程而言是相对隔离的,在多线程环境下,可以防止自己的变量被其他线程更改。

应用

Spring采用ThreadLocal的方式,来保证单个线程中的数据库操作使用的是同一个数据库连接,同时,采用这种方式,可以使业务层使用事务时不需要感知并管理connection对象,通过传播级别,能够管理多个事务配置之间的切换,挂起与恢复。
Spring框架里面使用的就是ThreadLocal来实现这种隔离级别,主要是在TransactionSynchronizationManager这个类中。如下为代码

private static final Log logger = LogFactory.getLog(TransactionSynchronizationManager.class);
private static final ThreadLocal<Map<Object, Object>> resources = new NamedThreadLocal("Transactional resources");
private static final ThreadLocal<Set<TransactionSynchronization>> synchronizations = new NamedThreadLocal("Transaction synchronizations");
private static final ThreadLocal<String> currentTransactionName = new NamedThreadLocal("Current transaction name");
private static final ThreadLocal<Boolean> currentTransactionReadOnly = new NamedThreadLocal("Current transaction read-only status");
private static final ThreadLocal<Integer> currentTransactionIsolationLevel = new NamedThreadLocal("Current transaction isolation level");
private static final ThreadLocal<Boolean> actualTransactionActive = new NamedThreadLocal("Actual transaction active");

在这里,Spring事务主要是ThreadLocal和AOP去实现的,每个线程自己的链接是靠ThreadLocal保存。

底层实现

线程进来之后,会初始化一个可以泛型的 ThreadLocal 对象,只要这个线程在 remove 之前去获取相应的值,都是可以获取到的。实现了线程间的数据隔离,不过如果要过去到其他线程中的数据还是有办法的。
我们来看看存储值的方法 set() 的源码:

public void set(T value) {
	Thread t = Thread.curr
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值