一。介绍
ThreadLocal的官方解释:ThreadLocal 是线程的局部变量,是每一个线程所单独持有的,其他线程不能对其进行访问, 通常是类中的 private static 字段。是一个以ThreadLocal对象为键,任意对象为值得存储结构,这个结构被附带在线程上。也就是说一个线程可以根据一个ThreadLocal对象查询绑定在这个线程上的一个值。
ThreadLocal也是线程安全的一种措施,有这么一个经典的比喻——“人手一只笔”。现在有100个人要签名,如果只有一支笔的话,那么肯定要排起长队了,但如果准备了100支笔,那就可以做到每人一支笔啦。
我们知道有时候一个对象的变量会被多个线程所访问,这时就会有线程安全问题,当然我们可以使用lock关键字来为此变量加锁,进行同步处理,从而限制只能有一个线程来使用此变量,但是加锁会大大影响程序执行效率,此外我们还可以使用ThreadLocal来解决对某一个变量的访问冲突问题。
当使用ThreadLocal维护变量的时候 为每一个使用该变量的线程提供一个独立的变量副本,即每个线程内部都会有一个该变量,这样同时多个线程访问该变量并不会彼此相互影响,因此他们使用的都是自己从内存中拷贝过来的变量的副本, 这样就不存在线程安全问题,也不会影响程序的执行性能。
下面是ThreadLocal类的定义
二、实例
1、测试主线程与新线程中的键值
private static ThreadLocal<string> local;
static void Main(string[] args)
{
//创建ThreadLocal并提供默认值
local = new ThreadLocal<string>(() => "主线程的Value");
//修改一个新的线程的
Thread th = new Thread(() =>
{
local.Value = "新的线程的value";
Display();
});
th.Start();
th.Join();
Display();
Console.ReadKey();
}
//显示当前线程中的数据值
private static void Display()
{
// 打印当前线程的唯一ID与对应的ThreadLocal的键值。
Console.WriteLine("{0} {1}", Thread.CurrentThread.ManagedThreadId, local.Value);
}
2、测试 八个线程的ThreadLocal值,如果有重复运行的,则打印repeat
class Program
{
// Demonstrates:
// ThreadLocal(T) constructor
// ThreadLocal(T).Value
// One usage of ThreadLocal(T)
static void Main()
{
// 返回一个string变量,该变量对每个线程是唯一的
ThreadLocal<string> ThreadName = new ThreadLocal<string>(() =>
{
return "Thread" + Thread.CurrentThread.ManagedThreadId;
});
//打印当前线程的ThreadLocal键值ThreadName.Value
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();
Console.ReadKey();
}
}
参考:
https://blog.csdn.net/qq_39915585/article/details/100128647?utm_medium=distribute.pc_relevant.none-task-blog-baidulandingword-3&spm=1001.2101.3001.4242