2015-06-24 38 views
32

.NET中的Java形式,有一個「超級」線程本地存儲(TLS),它允許任意TLS數據自動神奇地「跳」從一個線程到另一個。它基於CallContext class什麼是C#「邏輯調用上下文」

換句話說,一個邏輯請求可以生成的新線程的層次結構 - ,並且每個這些線程將具有訪問原始線程的相同TLS。這是一個非常強大的功能,特別是對於日誌記錄,授權,多租戶或品牌關注。

什麼是Java中的等價物?

只有在.net 4.5 has the "logical callcontext" gained a "copy on write" capability中允許線程對邏輯callcontext進行專用修改。換句話說,.net仍然正在成熟這種能力並提供更大的穩定性。

如果Java有一個等價的概念,如何穩定呢?它有什麼問題?

澄清

我已經知道,Java有一個線程本地存儲(TLS)的能力。這不是問題。我在問,Java是否具有.net「邏輯調用上下文」的等價物,它比簡單的TLS更強大。

+0

有趣的問題。不過,不幸的是,我認爲你運氣不好。就我所知,Java中沒有這種功能。我很樂意被糾正,並學習新的東西。 –

+0

只是澄清問題 - 如果您的示例中的「原始線程」更改其TLS數據,其子線程是否會看到更新的值?也就是說,子線程不僅獲得副本,還擁有父TLS的實時視圖? –

+1

JDK中沒有官方的異步支持。創建你自己的(沒有語言級語法)並不難。例如,我的[Fiber and FiberLocal](http://bayou.io/release/0.9/docs/async/Async_Programming.html#Fiber) – ZhongYu

回答

15

也許InheritableThreadLocal是你在找什麼?

我不知道這是否是完全一樣的,但據我瞭解它符合這一要求:

一個邏輯請求可以生成新線程的一個層次 - 而且每個線程將有訪問原始線程的相同TLS。

該類擴展的ThreadLocal向子線程提供值的繼承自父線程文檔:在創建子線程時,孩子收到的所有可繼承的線程局部變量的初始值父母有價值。通常孩子的價值觀與父母的價值觀是一致的。但是,通過重寫此類中的childValue方法,可以使孩子的價值成爲父母的任意函數。 當變量中維護的per-thread-attribute(例如User ID,Transaction ID)必須自動傳輸到創建的任何子線程時,可繼承的線程局部變量優先於普通線程局部變量。

我不知道你提到的能力「寫入時複製」,但我想你可以重寫InheritableThreadLocal.childValue(T)到代理家長的值,這樣寫不通過父和修改當前線程的本地存儲