ThreadStaticAttribute和ThreadLocal<T>都是提供线程本地存储,ThreadLocal<T>是.net4才提供的。
ThreadStaticAttribute只能标注静态字段,而ThreadLocal<T>可以对实例字段才有效。
如果不标注ThreadStaticAttribute,则多个线程共享一个变量,这样的话会引起冲突的。
class Program
{
static void Main()
{
Console.WriteLine("use [ThreadStaticAttribute]");
for (int i = 0; i < 3; i++)
{
Thread newThread = new Thread(ThreadData1.ThreadStaticDemo);
newThread.Start();
}
Thread.Sleep(500);
Console.WriteLine("not use [ThreadStaticAttribute]");
for (int i = 0; i < 3; i++)
{
Thread newThread = new Thread(ThreadData2.ThreadStaticDemo);
newThread.Start();
}
Thread.Sleep(500);
Console.WriteLine("not use static member, use instance member");
for (int i = 0; i < 3; i++)
{
Thread newThread = new Thread((new ThreadData3()).ThreadStaticDemo);
newThread.Start();
}
Thread.Sleep(500);
Console.WriteLine("");
for (int i = 0; i < 3; i++)
{
Thread newThread = new Thread(ThreadData4.ThreadStaticDemo);
newThread.Start();
}
Thread.Sleep(500);
Console.WriteLine("not use [ThreadStaticAttribute], use ThreadLocal<int>");
for (int i = 0; i < 3; i++)
{
Thread newThread = new Thread(ThreadData5.ThreadStaticDemo);
newThread.Start();
}
Thread.Sleep(500);
Console.WriteLine("not use [ThreadStaticAttribute], use ThreadLocal<int>");
ThreadLocal<string> ThreadName = new ThreadLocal<string>(() =>
{
return "Thread" + Thread.CurrentThread.ManagedThreadId;
});
// Action that prints out ThreadName for the current thread
Action action = () =>
{
// If ThreadName.IsValueCreated is true, it means that we are not the
// first action to run on this thread.
bool repeat = ThreadName.IsValueCreated;
Console.WriteLine("ThreadName = {0} {1}", ThreadName.Value, repeat ? "(repeat)" : "");
};
// Launch eight of them. On 4 cores or less, you should see some repeat ThreadNames
Parallel.Invoke(action, action, action, action, action, action, action, action);
// Dispose when you are done
ThreadName.Dispose();
}
}
class ThreadData1
{
static int threadSpecificData;
public static void ThreadStaticDemo()
{
// Store the managed thread id for each thread in the static
// variable.
threadSpecificData = Thread.CurrentThread.ManagedThreadId;
// Allow other threads time to execute the same code, to show
// that the static data is unique to each thread.
Thread.Sleep(100);
// Display the static data.
Console.WriteLine("Data for managed thread {0}: {1}",
Thread.CurrentThread.ManagedThreadId, threadSpecificData);
}
}
class ThreadData2
{
[ThreadStaticAttribute]// 可 ¨¦ 以 °? 省 º? 去 ¨£¤Attribute 直 ¡À 接 ¨® 写 ¡ä[ThreadStatic] 语 ®? 法 ¤¡§ 糖 ¬?
static int threadSpecificData;
public static void ThreadStaticDemo()
{
// Store the managed thread id for each thread in the static
// variable.
threadSpecificData = Thread.CurrentThread.ManagedThreadId;
// Allow other threads time to execute the same code, to show
// that the static data is unique to each thread.
Thread.Sleep(100);
// Display the static data.
Console.WriteLine("Data for managed thread {0}: {1}",
Thread.CurrentThread.ManagedThreadId, threadSpecificData);
}
}
class ThreadData3 // 使 º1 用 ®? 实 º¦Ì 例 ¤y 方 ¤? 法 ¤¡§ 也 °2 可 ¨¦ 以 °? 实 º¦Ì 现 ? 上 ¦? 述 º? 效 ¡ì 果 ? , ê? 每 ? 个 ? 线 ? 程 ¨¬ 单 Ì£¤ 独 ¨¤ 使 º1 用 ®? 各 ¡Â 自 Á? 的 Ì? 变 À? 量 ¢?
{
int threadSpecificData;
public void ThreadStaticDemo()
{
// Store the managed thread id for each thread in the static
// variable.
threadSpecificData = Thread.CurrentThread.ManagedThreadId;
// Allow other threads time to execute the same code, to show
// that the static data is unique to each thread.
Thread.Sleep(100);
// Display the static data.
Console.WriteLine("Data for managed thread {0}: {1}",
Thread.CurrentThread.ManagedThreadId, threadSpecificData);
}
}
class ThreadData4
{
[ThreadStaticAttribute]// 可 ¨¦ 以 °? 省 º? 去 ¨£¤Attribute 直 ¡À 接 ¨® 写 ¡ä[ThreadStatic] 语 ®? 法 ¤¡§ 糖 ¬?
static test t = null;
public static void ThreadStaticDemo()
{
t = new test();
Thread.Sleep(100);
// Display the static data.
Console.WriteLine(t.testvalue);
}
}
class test
{
public int testvalue = 0;
public test()
{
testvalue++;
}
}
class ThreadData5
{
static ThreadLocal<int> threadSpecificData = new ThreadLocal<int>();//only in .net framework 4.0. no need to use [ThreadStaticAttribute]
static public void ThreadStaticDemo()
{
// Store the managed thread id for each thread in the static
// variable.
threadSpecificData.Value = Thread.CurrentThread.ManagedThreadId;
// Allow other threads time to execute the same code, to show
// that the static data is unique to each thread.
Thread.Sleep(100);
// Display the static data.
Console.WriteLine("Data for managed thread {0}: {1}",
Thread.CurrentThread.ManagedThreadId, threadSpecificData.Value);
}
}
本文转自cnn23711151CTO博客,原文链接:http://blog.51cto.com/cnn237111/545801 ,如需转载请自行联系原作者