ThreadLocal難以在非同步程式設計或Reactive程式設計中使用 - bsideup
與同步程式設計不同,由於大量上下文切換和執行緒池,非同步程式設計使得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的想法),但這會嚴重影響效能。
相關文章
- Promise-在Java中以同步的方式非同步程式設計PromiseJava非同步程式設計
- Spring WebFlux和Reactive程式設計SpringWebUXReact程式設計
- [譯] 非同步程式設計:阻塞與非阻塞非同步程式設計
- Java併發程式設計—ThreadLocalJava程式設計thread
- Java併發程式設計 -- ThreadLocalJava程式設計thread
- Java併發程式設計——ThreadLocalJava程式設計thread
- 併發程式設計之:ThreadLocal程式設計thread
- 程式設計師何苦為難程式設計師?程式設計師
- Java 網路程式設計 —— 非阻塞式程式設計Java程式設計
- 非同步程式設計非同步程式設計
- 012 Rust 非同步程式設計,在 async 塊中使用?Rust非同步程式設計
- Javascript中的非同步程式設計JavaScript非同步程式設計
- 美女程式設計師觀點:程式設計師最重要的非程式設計技巧程式設計師
- 非同步程式設計:基於事件的非同步程式設計模式(EAP)非同步程式設計事件設計模式
- 簡單理解非同步程式設計(python)和非同步程式設計(nodejs)非同步程式設計PythonNodeJS
- 非同步程式設計之使用yield from非同步程式設計
- 阻塞式程式設計和非阻塞式程式設計區別程式設計
- Java併發程式設計:深入剖析ThreadLocalJava程式設計thread
- php非同步程式設計PHP非同步程式設計
- 非同步程式設計---Promise非同步程式設計Promise
- js 非同步程式設計JS非同步程式設計
- Dart 非同步程式設計Dart非同步程式設計
- Javascript 非同步程式設計JavaScript非同步程式設計
- java非同步程式設計Java非同步程式設計
- asyncio 非同步程式設計非同步程式設計
- 非同步程式設計 CompletableFuture非同步程式設計
- 招個程式設計師,難?程式設計師
- 非同步程式設計在ArkTS中具體怎麼實現?非同步程式設計
- 在Kotlin中如何利用協程進行非同步程式設計Kotlin非同步程式設計
- 併發程式設計之 ThreadLocal 原始碼剖析程式設計thread原始碼
- 簡單學:併發程式設計之 ThreadLocal程式設計thread
- Flutter 中的非同步程式設計總結Flutter非同步程式設計
- 【譯】Dart/Flutter中的非同步程式設計DartFlutter非同步程式設計
- 【譯】非同步程式設計:Futures非同步程式設計
- 淺談非同步程式設計非同步程式設計
- C#非同步程式設計C#非同步程式設計
- 非同步程式設計筆記非同步程式設計筆記
- EF Core非同步程式設計非同步程式設計