2013-01-05 10 views
9

私はscalaで計算ライブラリを作成しています。同様の機能私は、プロシージャの束とO(1)時間データのためのいくつかの静的に割り当てられたメモリを含むネイティブスカラーシングルトンオブジェクトにグループ化します。スレッドローカルオブジェクトをscalaに作成

このアプローチは、シングルスレッドでの使用に適しています。しかし、異なるスレッドから同時にライブラリ関数を呼び出すと、一時的なデータが上書きされ、呼び出し元に誤った回答が返される可能性があります。

私はこのライブラリをコピーして、静的に割り当てられたすべてのメモリを関数のローカル空間内に移動することでスレッドセーフ版を作成することができます。しかし、私はスレッドローカル変数を定義することによってそれを避けることを好む。

スカラでも可能ですか?

答えて

22

Javaのjava.lang.ThreadLocalクラスを使用して変数を保存するだけです。

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

(私は思い出すように、私の手の中に〜6ナノ秒)これを行うためのゼロ以外のパフォーマンスの低下があることに注意してください。非常に軽量な作業(インデックスの増分など)を行う場合は、速度の違いに気付くかもしれません。

+4

また、基本的には 'InheritableThreadLocal'のラッパーであるスカラの' DynamicVariable'があります。しかし、継承不可能なスレッドローカルのオプションは提供しません。 –

+0

@RégisJean-Gilles OPの質問に厳密には関係ないかもしれませんが、「InheritableThreadLocal」と言いました。プーリングのためにExecutorsのフレームワークとうまく組み合わせられていないようです。このような変数には、廃止予定の 'new Thread()。start()'に保存されているものの他に、ユースケースがありますか? – idonnie

+0

'DynamicVariable'はダイナミックスコープパターン*を実装するのに便利です。私の他の答えは例を参照してください:http://stackoverflow.com/a/13252952/1632462。ただし、マルチスレッドのコンテキストでは使用してはいけません。マルチコンテキストでは動作しません。 –

関連する問題