2015-06-24 14 views
32

In .net, c'è un "uber" thread-local-storage (TLS) che consente ai dati TLS arbitrari di "saltare" automaticamente da una discussione a un'altra . È basato sullo CallContext class.Qual è l'equivalente Java di C# "Contesto logico di chiamata"

In altre parole, una richiesta logica può generare una gerarchia di nuovi thread e ognuno di questi thread avrà accesso allo stesso TLS del thread originale. È una funzionalità molto potente, in particolare per problemi di registrazione, autorizzazione, multi-tenancy o branding.

Qual è l'equivalente in Java?

Solo in .net 4.5 has the "logical callcontext" gained a "copy on write" capability che consente ai thread di apportare modifiche private al callcontext logico. In altre parole, .net sta ancora maturando questa capacità e fornisce una maggiore stabilità.

Se Java ha una nozione equivalente, quanto è stabile? Che problemi ha?

Chiarimento

so già che Java ha una capacità di Thread Local Storage (TLS). Questa non è la domanda. Sto chiedendo se Java ha un equivalente del .net "contesto di chiamata logica" che è un costrutto molto più potente del semplice TLS.

+0

Interessante domanda. Tuttavia, sfortunatamente penso che tu sia sfortunato.Per quanto ne so, non esiste una funzionalità di questo tipo in Java. Sarei felice di essere corretto e di imparare qualcosa di nuovo. –

+0

Solo una domanda per chiarimenti - se il "filo originale" nel tuo esempio cambia i suoi dati TLS, i suoi fili figli vedono il valore aggiornato? Ad esempio, i thread figlio non solo ottengono una copia, hanno una visualizzazione live del TLS principale? –

+1

Non esiste un supporto asincrono ufficiale in JDK. Non è difficile però crearne di propri (senza sintassi a livello di linguaggio). Ad esempio, il mio [Fiber e FiberLocal] (http://bayou.io/release/0.9/docs/async/Async_Programming.html#Fiber) – ZhongYu

risposta

15

Forse InheritableThreadLocal è quello che stai cercando?

io non sono sicuro se è esattamente lo stesso, ma per quanto mi risulta risponde a questa esigenza:

una richiesta logica può generare una gerarchia di nuove discussioni - e ciascuno di quei fili avranno accedere allo stesso TLS del thread originale.

Dalla documentazione

Questa classe estende ThreadLocal per fornire l'eredità di valori da filo genitore a thread figlio: quando si crea un thread figlio, il bambino riceve i valori iniziali per tutte le variabili ereditabile thread-local per il quale il genitore ha dei valori. Normalmente i valori del bambino saranno identici a quelli del genitore; tuttavia, il valore del figlio può essere reso una funzione arbitraria del genitore sostituendo il metodo childValue in questa classe. Le variabili locali filettate ereditabili vengono utilizzate preferibilmente rispetto alle normali variabili locali del thread quando l'attributo per-thread che viene mantenuto nella variabile (ad esempio, ID utente, ID transazione) deve essere automaticamente trasmesso a qualsiasi thread figlio creato.

non so circa il "copy on write" capacità che lei ha citato, ma credo che è possibile ignorare InheritableThreadLocal.childValue(T) per delega il valore del genitore in modo che le scritture non passano attraverso al genitore e modificare il thread corrente del memoria locale

Problemi correlati