ThreadLocal難以在非同步程式設計或Reactive程式設計中使用 - bsideup

banq發表於2020-02-26

與同步程式設計不同,由於大量上下文切換和執行緒池,非同步程式設計使得ThreadLocal難以使用。

最簡單的是……根本不使用ThreadLocals:D

例如,在Project Reactor中,您可以使用ContextAPI:

Mono.just("Hello %s")
    .delaySubscription(Flowable.timer(1, TimeUnit.SECONDS))
    .transform(flux -> Mono.deferWithContext(ctx -> {
        return flux.doOnNext(greeting -> {
            // Get it from the Context
            String userId = ctx.get("userId");
            System.out.println(String.format(greeting, userId));
        });
    }))

    // Put something to the Context, e.g. in the web filter
    .subscriberContext(Context.of("userId", "bsideup"))
    .block();

在Reactor內部,它不使用任何ThreadLocal,也不會暴露於多執行緒問題。

但是,此API是Reactor特定的,並且未在Reactive Streams規範中定義,並且您不會在RxJava之類的庫中找到它

其他想法:

可以提出一個通用的Scheduler抽象,這樣,探測鉤子只需要設定一次。直到JDK中出現此類API。

另一種選擇是始終線上程上執行所有內容(類似於Netty的想法),但這會嚴重影響效能。

相關文章