Этот вопрос заставлял меня задаваться вопросом о потоковом локальном хранилище в высоком -уровневые разработки, такие как Java и .NET.
Java имеет ThreadLocal<T>
класс (и, возможно, другие конструкции), в то время как .NET имеет слоты данных, и вскоре ThreadLocal<T>
собственный. (Он также имеет ThreadStaticAttribute
, но меня особенно интересует поточно-локальное хранилище данных участника.) Большинство других современных сред разработки предоставить один или несколько механизмов для него, будь то на уровне языка или структуры.
Какие проблемы решает проблема локального хранилища потоков или какие преимущества обеспечивает поточно-локальное хранилище над стандартной объектно-ориентированной идиомой создания отдельных экземпляров объектов для хранения локальных данных потока? Другими словами, как это:
// 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();
}
Я вижу, что использование одного объекта с локальным хранилищем потоков может быть немного более экономичным и требует меньше ресурсов процессора из-за меньшего количества распределений (и конструкций). Существуют ли другие преимущества?