2013-01-05 16 views
9

Piszę bibliotekę obliczeniową w scala. Podobna funkcjonalność grupuje się w natywne pojedyncze obiekty scala zawierające wiele procedur i pewną statycznie przydzieloną pamięć dla O (1) danych czasowych.tworzenie obiektów lokalnych wątku na scala

Podejście to nadaje się do użycia w jednym cyklu. Ale wywoływanie funkcji bibliotecznych z różnych wątków jednocześnie może nadpisywać tymczasowe dane i dawać nieprawidłowe odpowiedzi dla dzwoniących.

Mogę po prostu skopiować tę bibliotekę i napisać wersję bezpieczną dla wątków, przenosząc wszystkie statycznie przydzielone pamięci do funkcji lokalnej. Ale wolę go unikać, definiując zmienne lokalne wątku.

Czy to możliwe w scala?

Odpowiedz

22

Po prostu użyj klasy Java java.lang.ThreadLocal do przechowywania zmiennych.

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

Należy pamiętać, że istnieje niezerowa kara za wykonanie tego (około 6 ns w moich rękach, o ile pamiętam). Jeśli robisz naprawdę lekkie rzeczy (np. Inkrementując indeks), możesz zauważyć różnicę w prędkości.

+4

Należy również zauważyć, że istnieje 'DynamicVariable' programu scala, który jest w zasadzie opakowaniem wokół' InheritableThreadLocal'. Nie zapewnia jednak żadnej opcji dla nieinternetowych mieszkańców wątków. –

+0

@ Régis Jean-Gilles Być może nie jest to ściśle związane z pytaniem OP, ale: wspomniałeś o 'InheritableThreadLocal', wydaje się, że nie łączy się dobrze ze strukturą' Executors' z powodu łączenia. Czy istnieje przypadek użycia dla takich zmiennych, oprócz rzeczy, które są przechowywane w przestarzałym 'new Thread(). Start()'? – idonnie

+0

'DynamicVariable' jest przydatna do implementacji * wzorca zakresu dynamicznego *. Zobacz moją drugą odpowiedź na przykład: http://stackoverflow.com/a/13252952/1632462. Jednak nigdy nie może być używany w kontekście wielowątkowym, gdzie po prostu nie zadziała. –

Powiązane problemy