この質問から、Javaや.NETなどの高レベルの開発フレームワークでのスレッドローカルストレージについて疑問に思いました。
JavaにはThreadLocal<T>
クラス(およびおそらく他の構造)がありますが、.NETにはデータスロットがあり、まもなくThreadLocal<T>
独自のクラスがあります。(これもありますが、ThreadStaticAttribute
メンバーデータのスレッドローカルストレージに特に興味があります。)他のほとんどの最新の開発環境では、言語レベルまたはフレームワークレベルで1つ以上のメカニズムが提供されます。
スレッドローカルストレージはどのような問題を解決しますか、またはスレッドローカルデータを含む個別のオブジェクトインスタンスを作成する標準のオブジェクト指向イディオムに対してスレッドローカルストレージはどのような利点を提供しますか?言い換えれば、これはどうですか?
// Thread local storage approach - start 200 threads using the same object
// Each thread creates a copy of any thread-local data
ThreadLocalInstance instance = new ThreadLocalInstance();
for(int i=0; i < 200; i++) {
ThreadStart threadStart = new ThreadStart(instance.DoSomething);
new Thread(threadStart).Start();
}
これより優れていますか?
// Normal oo approach, create 200 objects, start a new thread on each
for(int i=0; i < 200; i++) {
StandardInstance standardInstance = new StandardInstance();
ThreadStart threadStart = new ThreadStart(standardInstance.DoSomething);
new Thread(threadStart).Start();
}
スレッドローカルストレージで単一のオブジェクトを使用すると、メモリ効率がわずかに向上し、割り当て(および構造)が少なくなるため、必要なプロセッサリソースが少なくなることがわかります。他に利点はありますか?