ThreadLocal的使用

2023-10-27

一。介绍

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

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ThreadLocal的使用 的相关文章

  • boost::multi_index_container 复合键中的 equal_range 与比较运算符

    我正在尝试从多索引容器查询结果 其中值类型是三个元素的结构 第一个值已给出 但第二个和第三个值必须大于或小于查询参数 经过搜索后 我发现必须实现自定义密钥提取器 并且这里的一些链接建议相同 但我无法实现它 boost multi index
  • ROWNUM 的 OracleType 是什么

    我试图参数化所有现有的 sql 但以下代码给了我一个问题 command CommandText String Format SELECT FROM 0 WHERE ROWNUM lt maxRecords command CommandT
  • 自动从 C# 代码进行调试过程并读取寄存器值

    我正在寻找一种方法来读取某个地址的 edx 注册表 就像这个问题中所问的那样 读取eax寄存器 https stackoverflow com questions 16490906 read eax register 虽然我的解决方案需要用
  • fgets() 和 Ctrl+D,三次才能结束?

    I don t understand why I need press Ctrl D for three times to send the EOF In addition if I press Enter then it only too
  • 使用 Microsoft Graph API 订阅 Outlook 推送通知时出现 400 错误请求错误

    我正在尝试使用 Microsoft Graph API 创建订阅以通过推送通知获取 Outlook 电子邮件 mentions 我在用本文档 https learn microsoft com en us graph api subscri
  • 跨多个控件共享事件处理程序

    在我用 C 编写的 Windows 窗体应用程序中 我有一堆按钮 当用户的鼠标悬停在按钮上时 我希望按钮的边框发生变化 目前我有以下多个实例 每个按钮一个副本 private void btnStopServer MouseEnter ob
  • 写入和读取文本文件 - C# Windows 通用平台应用程序 Windows 10

    有用 但在显示任何内容之前 您必须在文本框中输入内容 我想那是因为我使用了 TextChanged 事件处理程序 如果我希望它在没有用户交互的情况下显示文本文件的内容 我应该使用哪个事件处理程序 因此 我想在按下按钮时将一些数据写入 C W
  • 使用 Google Analytics API 在 C# 中显示信息

    我一整天都在寻找一个好的解决方案 但谷歌发展得太快了 我找不到有效的解决方案 我想做的是 我有一个 Web 应用程序 它有一个管理部分 用户需要登录才能查看信息 在本节中 我想显示来自 GA 的一些数据 例如某些特定网址的综合浏览量 因为我
  • C# 用数组封送结构体

    假设我有一个类似于 public struct MyStruct public float a 我想用一些自定义数组大小实例化一个这样的结构 在本例中假设为 2 然后我将其封送到字节数组中 MyStruct s new MyStruct s
  • 在 ASP.Net Core 2.0 中导出到 Excel

    我曾经使用下面的代码在 ASP NET MVC 中将数据导出到 Excel Response AppendHeader content disposition attachment filename ExportedHtml xls Res
  • 使用向量的 merge_sort 在少于 9 个输入的情况下效果很好

    不知何故 我使用向量实现了合并排序 问题是 它可以在少于 9 个输入的情况下正常工作 但在有 9 个或更多输入的情况下 它会执行一些我不明白的操作 如下所示 Input 5 4 3 2 1 6 5 4 3 2 1 9 8 7 6 5 4 3
  • 如何在 Team Foundation 上强制发表有意义的签入评论?

    我有一个开发团队有一个坏习惯 他们写道poor签入评论 当我们必须在团队基础上查看文件的历史记录时 这使得它成为一场噩梦 我已经启用了变更集评论政策 这样他们甚至可以在签到时留下评论 否则他们不会 我们就团队的工作质量进行了一些讨论 他们很
  • 使用 LINQ 查找列表中特定类型的第一个元素

    使用 LINQ 和 C 在元素列表中查找特定类型的第一个项目的最短表示法是什么 var first yourCollection OfType
  • 初始化变量的不同方式

    在 C 中初始化变量有多种方法 int z 3 与 int 相同z 3 Is int z z 3 same as int z z 3 您可以使用 int z z 3 Or just int z 3 Or int z 3 Or int z i
  • 在 URL 中发送之前对特殊字符进行百分比编码

    我需要传递特殊字符 如 等 Facebook Twitter 和此类社交网站的 URL 为此 我将这些字符替换为 URL 转义码 return valToEncode Replace 21 Replace 23 Replace 24 Rep
  • 作为字符串的动态属性名称

    使用 DocumentDB 创建新文档时 我想设置属性名称动态地 目前我设置SomeProperty 像这样 await client CreateDocumentAsync dbs db colls x new SomeProperty
  • 如何构建印度尼西亚电话号码正则表达式

    这些是一些印度尼西亚的电话号码 08xxxxxxxxx 至少包含 11 个字符长度 08xxxxxxxxxxx 始终以 08 开头 我发现这个很有用 Regex regex new Regex 08 0 9 0 9 0 9 0 9 0 9
  • 在Linux中使用C/C++获取机器序列号和CPU ID

    在Linux系统中如何获取机器序列号和CPU ID 示例代码受到高度赞赏 Here http lxr linux no linux v2 6 39 arch x86 include asm processor h L173Linux 内核似
  • 方法参数内的变量赋值

    我刚刚发现 通过发现错误 你可以这样做 string s 3 int i int TryParse s hello out i returns false 使用赋值的返回值是否合法 Obviously i is but is this th
  • 不同类型的指针可以互相分配吗?

    考虑到 T1 p1 T2 p2 我们可以将 p1 分配给 p2 或反之亦然吗 如果是这样 是否可以不使用强制转换来完成 或者我们必须使用强制转换 首先 让我们考虑不进行强制转换的分配 C 2018 6 5 16 1 1 列出了简单赋值的约束

随机推荐

  • chemdraw怎么连接两个结构_科研小站

    化学结构绘图必备软件 ChemDraw了解一下 软件简介 ChemDraw是由CambridgeSoft公司制作的ChemOffice系列软件 是目前国内外最流行 最有应用价值的化学绘图软件 可以快速 精确地绘制化学结构 是各期刊指定的化学
  • C语言---形参所导致的段错误

    前言 今天刷B站 无意之间看到一个宣称90 人都会错的嵌入式面试题 感兴趣就看了一下 卡了十多分钟才想明白 只是一个小知识点 但还是分享一下 题目 include
  • 项目:UDP聊天室

    UDP UDP User Datagram Protocol 是一种无连接 不可靠 面向数据报的传输协议 与TCP相比 UDP更加轻量级 不提供像TCP那样的可靠性和流控制机制 但具备较低的通信延迟和较少的开销 UDP具有以下几个特点 1
  • Mosaic 【HDU - 4819】【二维线段树】

    题目链接 这道题难就只是难在题目难读 题意读懂后就是一道普通的二维线段树更新查找问题 题意 给你一个N N的矩阵 并且已经建立了初始值 然后给你个点以及L 很多人不解其义 其实就是给你个点 然后查的是以 x y 为基础的点 在以左上角 x
  • Python 图像处理入门(识别物体轮廓)

    经过灰度化 高斯滤波 二值化后得到大致轮廓 根据轮廓大小筛选部分干扰元素 尽可能只保留主要物体的轮廓 1 灰度化 图像灰度化是指将图像从彩色转换为灰度图像的过程 这通常是通过将每个像素的 RGB 值转换为单个灰度值来完成的 灰度值通常是使用
  • 剑指offer——连续子数组的最大和

    题目链接 https www nowcoder com practice 459bd355da1549fa8a49e350bf3df484 tpId 13 tqId 11183 rp 1 ru 2Factivity 2Foj qru 2Ft
  • -------Python中ConfigArgParse模块介绍---------

    来源 https pypi org project ConfigArgParse import configargparse p configargparse ArgParser default config files etc app c
  • 生信学习——R语言小作业-中级(附详细答案解读)

    题目目录 1 请根据R包org Hs eg db找到下面ensembl 基因ID 对应的基因名 symbol 2 根据R包hgu133a db找到下面探针对应的基因名 symbol 3 找到R包CLL内置的数据集的表达矩阵里面的TP53基因
  • 从零开始自动化测试框架设计:自动化测试环境搭建一:eclipse+svn+selenium+Junit+maven

    本机环境 window7 旗舰版 Service Pack 1 64位操作系统 一 安装JDK 官网下载jdk1 6 0 17或以上版本 本人用的是jdk1 6 0 17 下载完后安装在C盘根目录C jdk1 6 0 17 配置系统环境变量
  • Linux装好后,ping不通Windows默认网关及ip地址,原因是Linux网络未配置好,解决linux网络连接问题

    1 解决Linux网络连接问题 1 第一步 首先打开图形化界面 右键选择打开终端 打开控制台ping一下Windows连接网络的网关地址或者IP地址 如图 ping 192 168 113 1 这是本人Windows操作系统中连接网络的网关
  • 软件测试Bug的四种级别

    软件测试的四种Bug级别 1 致命 常规操作引起的系统崩溃 死机 死循环 造成数据泄露的安全性问题 对用户财产造成损失 2 严重 重要功能未实现 非常规操作导致的系统崩溃 死机 死循环 外观难以接受的缺陷 常见安全隐私类问题 例如 密码明文
  • 程序中出现net.ERR_UNKNOWN_URL_SCHEME 是什么原因?

    这个错误通常是因为你在程序中使用了一个无效的 URL 地址 具体来说 它缺少了协议头 例如 http 或 https 你应该检查你的代码 确保 URL 地址是正确的 并且包含了合法的协议头 例如 如果你的代码中有这样一行 const url
  • 一个转为爬虫设计的浏览器,修改chromnium代码,无视画布指纹追踪,webrtc泄露IP,支持selenium驱动,删除webdriver属性,修改event的isTrusted属性

    闲言碎语 做爬虫的都知道canvs font webgl等指纹 我个人感觉 代码1 这些除了canvs font webgl之外没啥大用 同样安装谷歌浏览器的 你有我也有 厂商无法当作指纹唯一的标准 前几天遇到携程这种的 连续获取你几遍画布
  • TL431 三端可控精密稳压器

    1 TL431是三端可控精密稳压源 有插件TO 92和贴片SOT 23 3两种常用的封装 如图1 图2 图4 图5 它由三个脚 分别是R 参考极 A 阳极 K 阴极 组成 TL431的内部参考电压是2 5V 2 TL431通常结合光耦进行反
  • Python系列-17]:人工智能 - 数学基础 -7- 微积分、导数与极值、梯度下降法

    作者主页 文火冰糖的硅基工坊 https blog csdn net HiWangWenBing 本文网址 https blog csdn net HiWangWenBing article details 119325116 目录 第1章
  • 阿里云备案成功的域名能用腾讯云的服务器吗?

    必须可以 只需要操作一步 那就是备案转接入 工信部规定 域名只需要备案一次 但可以接入多次 每新增一个平台的解析 就必须增加备案转接入 所以任何平台都可以用 只需要做一步 那就是转接入 首次备案需要经过云平台初审加管局审核 通常需要十五个工
  • win10默认浏览器里多余了一个无效选项

    到注册表里删除以下位置里的无效项 HKEY CURRENT USER SOFTWARE Clients StartMenuInternet HKEY LOCAL MACHINE SOFTWARE Clients StartMenuInter
  • C++ 运算符

    运算符 运算符是一种告诉编译器执行特定的数学或逻辑操作的符号 C 提供了以下类型的运算符 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 杂项运算符 算术运算符 下表显示了 C 支持的所有算术运算符 假设变量 A 的值为 10 变
  • java反射

    文章目录 1 反射的缘起 1 1 什么是反射及反射机制 1 2 为什么会产生反射 1 反射的缘起 1 1 什么是反射及反射机制 反射就是把java类中的各个成分 构造器 属性 方法 映射成一个个的java对象 即在运行状态中 1 对于任意一
  • ThreadLocal的使用

    一 介绍 ThreadLocal的官方解释 ThreadLocal 是线程的局部变量 是每一个线程所单独持有的 其他线程不能对其进行访问 通常是类中的 private static 字段 是一个以ThreadLocal对象为键 任意对象为值