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的想法),但這會嚴重影響效能。
相關文章
- python 網路程式設計----非阻塞或非同步程式設計Python程式設計非同步
- Promise-在Java中以同步的方式非同步程式設計PromiseJava非同步程式設計
- Socket程式設計中的同步、非同步、阻塞和非阻塞(轉)程式設計非同步
- 使用非同步程式設計非同步程式設計
- C#~非同步程式設計在專案中的使用C#非同步程式設計
- [譯] 非同步程式設計:阻塞與非阻塞非同步程式設計
- Spring WebFlux和Reactive程式設計SpringWebUXReact程式設計
- 程式設計師的“非程式設計師”之路程式設計師
- 程式設計師何苦為難程式設計師?程式設計師
- 程式設計師何必難為程式設計師程式設計師
- Java 網路程式設計 —— 非阻塞式程式設計Java程式設計
- Javascript中的非同步程式設計JavaScript非同步程式設計
- 程式設計師OR非程式設計師,有些程式設計的事需要知道程式設計師
- Java併發程式設計—ThreadLocalJava程式設計thread
- 併發程式設計之:ThreadLocal程式設計thread
- Java併發程式設計 -- ThreadLocalJava程式設計thread
- Java併發程式設計——ThreadLocalJava程式設計thread
- 非同步程式設計非同步程式設計
- 美女程式設計師觀點:程式設計師最重要的非程式設計技巧程式設計師
- 非同步程式設計:基於事件的非同步程式設計模式(EAP)非同步程式設計事件設計模式
- 阻塞式程式設計和非阻塞式程式設計區別程式設計
- 程式設計師在程式設計中遇到的奇葩弱智問題程式設計師
- 非同步程式設計之使用yield from非同步程式設計
- Dart 非同步程式設計Dart非同步程式設計
- php非同步程式設計PHP非同步程式設計
- asyncio 非同步程式設計非同步程式設計
- js 非同步程式設計JS非同步程式設計
- 非同步程式設計---Promise非同步程式設計Promise
- Javascript 非同步程式設計JavaScript非同步程式設計
- JavaScript非同步程式設計JavaScript非同步程式設計
- java非同步程式設計Java非同步程式設計
- 招個程式設計師,難?程式設計師
- 程式設計到底難在哪裡?程式設計
- 程式設計師與非程式設計師的思維差異程式設計師
- 【譯】Dart/Flutter中的非同步程式設計DartFlutter非同步程式設計
- Flutter 中的非同步程式設計總結Flutter非同步程式設計
- Python 中的非同步程式設計:AsyncioPython非同步程式設計
- 012 Rust 非同步程式設計,在 async 塊中使用?Rust非同步程式設計