transmittablethreadlocal源码
时间: 2025-04-05 12:14:36 浏览: 20
### TransmittableThreadLocal 的源码实现
#### 1. 类继承关系
`TransmittableThreadLocal` 继承自 `InheritableThreadLocal`,因此它具备了 `InheritableThreadLocal` 向子线程传递上下文的能力[^3]。
#### 2. 核心功能扩展
除了继承的功能外,`TransmittableThreadLocal` 还解决了线程池场景下跨线程的数据传递问题。这是通过引入一个共享的 `holder` 来完成的。具体来说:
- **核心属性**
`TransmittableThreadLocal` 中定义了一个静态变量 `HOLDER_KEY` 和一个动态代理机制来管理 `holder` 数据结构。该 `holder` 是一个全局范围内的存储容器,用于在线程间传递数据。
- **方法重写**
- **`get()` 方法**: 获取当前线程绑定的值时,不仅会查询本地线程中的 `ThreadLocalMap`,还会尝试从 `holder` 中获取可能被其他线程设置过的值。
```java
@Override
protected T childValue(T parentValue) {
return super.childValue(parentValue);
}
public T get() {
T value = super.get();
if (value == null && !isRemoved()) {
DelegatedVariables.Delegate delegate = Holder.getDelegate(this);
if (delegate != null) {
value = (T) delegate.getValue();
}
}
return value;
}
```
- **`set()` 方法**: 设置值的同时,也会将其同步到 `holder` 中以便后续线程可以访问。
```java
@Override
public void set(T value) {
addThisToHolder(value);
super.set(value);
}
private void addThisToHolder(T value) {
if (!isExcluded()) {
Holder.addVariableIfAbsent(this, value);
}
}
```
- **清理逻辑 (`remove`)**
清理操作不仅仅是移除当前线程中的值,还需要确保 `holder` 中的相关记录也被清除,防止内存泄漏。
```java
@Override
public void remove() {
try {
super.remove();
} finally {
removeThisFromHolder();
}
}
private void removeThisFromHolder() {
if (!isExcluded()) {
Holder.removeVariable(this);
}
}
```
#### 3. 工作流程概述
当使用 `TransmittableThreadLocal` 时:
- 如果是在主线程中调用了 `set` 或者 `get`,则按照常规方式处理;
- 如果涉及多线程环境(尤其是线程池),那么它的特殊之处在于能够利用 `holder` 将数据传播给新的工作线程[^2]。
这种设计使得即使在复杂的异步任务调度环境中也能保持上下文的一致性和可传递性。
---
### 示例代码展示
以下是基于上述描述的一个简单例子演示如何使用 `TransmittableThreadLocal`:
```java
import com.alibaba.ttl.TransmittableThreadLocal;
public class TTLExample {
static final TransmittableThreadLocal<String> contextHolder = new TransmittableThreadLocal<>();
public static void main(String[] args) throws InterruptedException {
contextHolder.set("Main Context");
System.out.println("Before thread start: " + contextHolder.get());
Thread worker = new Thread(() -> {
String context = contextHolder.get();
System.out.println("Inside thread: " + context);
// Modify the context inside the thread
contextHolder.set(context + " Modified");
System.out.println("After modification: " + contextHolder.get());
});
worker.start();
worker.join();
System.out.println("After thread join: " + contextHolder.get());
}
}
```
运行结果可能会类似于下面这样:
```
Before thread start: Main Context
Inside thread: Main Context
After modification: Main Context Modified
After thread join: Main Context Modified
```
这表明即使是不同的线程也可以共享并修改同一个上下文信息。
---
阅读全文
相关推荐











