Skip to the content.

首页

ThreadLocal增强


Netty - FastThreadLocal

FastThreadLocal

更快的ThreadLocal,核心思路是空间换时间;因为ThreadLocal一般都是作为静态变量使用,故ThreadLocal引用不存在被GC回收的场景,这样ThreadLocal清理过期键的功能反而会影响效率,FastThreadLocal完全摒弃了清理过期键的功能,并支持随机访问,效率明显优于ThreadLocal的线性探测法;多实例ThreadLocal场景下不要使用,会造成空间的大量浪费甚至内存溢出。

属性

方法

InternalThreadLocalMap

属性

方法


TTL - TransmittableThreadLocal

InheritableThreadLocal增强实现,用于在线程池场景下优雅的实现上下文传递,通过其crr机制传递TTL值,并保证上下文的隔离性,以及防止内存泄漏。

class TransmittableThreadLocal<T> extends InheritableThreadLocal<T> implements TtlCopier<T>

属性

方法

class Transmitter

工具类,转移器,用于注册Transmittee,供TtlRunnable、TtlCallable、TtlRecursiveTask、TtlRecursiveAction使用。

interface Transmittee

public interface Transmittee<C, B> {

    // 1、抓取:创建任务时抓取当前线程的ThreadLocal值保存至任务对象中;
    C capture(); 

    // 2、回放:任务执行前将抓取的ThreadLocal值设置到任务执行线程中,并备份原ThreadLocal值后返回;
    @NonNull
    B replay(@NonNull C captured);

    // 清理:任务执行前清理ThreadLocal值并备份;
    @NonNull
    B clear();

    // 3. 恢复:任务执行的finally阶段,将备份的原ThreadLocal值重新设置到执行线程中。
    void restore(@NonNull B backup);
}

转移者的crr机制

属性

CRR机制

public static Object capture() { ... }

public static Object replay(Object captured) { ... }

public static Object clear() { ... }

public static void restore(Object backup) { ... }

静态的capture、replay、restore及clear方法,均是遍历transmitteeSet并调用其对应方法。

TtlRunnable & TtlCallable

使用了装饰器模式,调用Transmitter的crr方法。

public final class TtlCallable<V> implements Callable<V>, TtlWrapper<Callable<V>>, TtlEnhanced, TtlAttachments {
    private final AtomicReference<Object> capturedRef; // 创建时抓取的上下文
    private final Callable<V> callable; // 被包装的任务

    public V call() throws Exception {
        final Object captured = capturedRef.get(); // 1、获取抓取上下文;
        ...
        final Object backup = replay(captured); // 2、任务执行前将抓取的上下文设置到当前线程内;
        try {
            return callable.call(); // 3、执行任务,任务能获取到抓取的上下文;
        } finally {
            restore(backup); // 4、恢复当前线程原上下文。
        }
    }

    ...
}

TtlRecursiveAction & TtlRecursiveTask

ForkJoinTask任务,调用Transmitter的crr方法。

public abstract class TtlRecursiveTask<V> extends ForkJoinTask<V> implements TtlEnhanced {
    private final Object captured = capture(); // 创建时抓取的上下文

    protected final boolean exec() {
        final Object backup = replay(captured);
        try {
            result = compute();
            return true;
        } finally {
            restore(backup);
        }
    }

    ...
}

TtlExecutors

工具类