您的位置:首页 > 其它

ThreadStaticAttribute和ThreadLocal<T>使用区别总结

2011-04-15 16:39 671 查看
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);

}

}

本文出自 “一只博客” 博客,请务必保留此出处http://cnn237111.blog.51cto.com/2359144/545801
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: