2013-01-05 7 views
9

Sto scrivendo una libreria computazionale in scala. Funzionalità simile I raggruppa in oggetti scala singoli nativi contenenti un mucchio di procedure e una memoria allocata staticamente per dati O (1) temporali.creazione di oggetti locali thread su scala

Questo approccio è adatto per un utilizzo a thread singolo. Ma chiamare le funzioni della libreria da thread diversi simultaneamente può sovrascrivere i dati temporali e fornire risposte errate ai chiamanti.

Posso semplicemente copiare questa libreria e scrivere la versione thread-safe spostando tutta la memoria allocata staticamente all'interno dello spazio locale delle funzioni. Ma preferisco evitarlo definendo le variabili locali del thread.

E 'possibile in scala?

risposta

22

Utilizzare semplicemente la classe java.lang.ThreadLocal di Java per memorizzare le variabili.

val tl = new ThreadLocal[String] 
tl.set("fish") 
tl.get // "fish" 

essere consapevoli del fatto che v'è una riduzione delle prestazioni diverso da zero per fare questo (~ 6 ns nelle mie mani, se ricordo bene). Se stai facendo cose davvero leggere (ad esempio incrementando un indice), potresti notare la differenza di velocità.

+4

Si noti inoltre che c'è 'DynamicVariable' di scala che è fondamentalmente un wrapper attorno a 'InheritableThreadLocal'. Tuttavia, non fornisce alcuna opzione per locals di thread non ereditabili. –

+0

@ Régis Jean-Gilles Forse non è strettamente correlato alla domanda di OP, ma: hai menzionato 'InheritableThreadLocal', sembra che non si combini bene con il framework di' Executors' a causa del pooling. Esiste un caso d'uso per tali variabili, oltre a ciò che viene tenuto in deprecato 'new Thread(). Start()'? – idonnie

+0

'DynamicVariable' è utile per implementare il * dynamic scope pattern *. Vedi la mia altra risposta con l'esempio: http://stackoverflow.com/a/13252952/1632462. Tuttavia non deve mai essere usato in un contesto multi-thread, in cui semplicemente non funzionerà. –