可能经常做多线程、线程池的童鞋早就知道这种问题,原谅我一直对线程研究不深。

这个东西好像出现有一段时间了,不过最近我才用到,做的API的服务,用来保存当前请求的上下文内容,原来用过Thread.SetData,不过原来的用户量没这么大,没发现问题。

查了一些关于ThreadStatic的说明,有一些人说好,也有人说坑的,的确有坑,下面看个例子:

    class Program
{
[ThreadStatic]
private static int? NowI;
//private static string resultString = ""; static void Main(string[] args)
{
//resultString = "";
for (var i = 0; i < 100; i++)
{
int i1 = i;
var t = new Task(() =>
{
if(NowI == null) NowI = i1;
//var nowI = Thread.GetData(Thread.GetNamedDataSlot("NowI"));
//if (nowI == null)
//{
// nowI = i1;
// Thread.SetData(Thread.GetNamedDataSlot("NowI"), i1);
//} Console.WriteLine(string.Format("第{0}次循环, i值:{1},线程ID:{2}\r\n", i1, NowI, Thread.CurrentThread.ManagedThreadId));
});
t.Start();
}
//Console.WriteLine(resultString.ToString());
Console.Read();
}
}

  NowI保存在ThreadStatic中,循环100次,开100个线程,运行结果(结果没排序,不过已经可以看出问题了):

第1次循环, i值:1,线程ID:12

第2次循环, i值:1,线程ID:12

第3次循环, i值:3,线程ID:15

第0次循环, i值:0,线程ID:6

第5次循环, i值:5,线程ID:17

第4次循环, i值:4,线程ID:14

第6次循环, i值:6,线程ID:11

第12次循环, i值:6,线程ID:11

第13次循环, i值:6,线程ID:11

第14次循环, i值:6,线程ID:11

第15次循环, i值:6,线程ID:11

第16次循环, i值:6,线程ID:11

第17次循环, i值:6,线程ID:11

第18次循环, i值:6,线程ID:11

第19次循环, i值:6,线程ID:11

第20次循环, i值:6,线程ID:11

第21次循环, i值:6,线程ID:11

第22次循环, i值:6,线程ID:11

第23次循环, i值:6,线程ID:11

第24次循环, i值:6,线程ID:11

......

可以看出, 线程ID一样的,保存的NowI变量的值是一样的,再猜,可能是GC没有回收垃圾,然后在new Task最后加上GC.Collect,然而并没有什卵用。

问题原因是这样的:当线程重用时,垃圾回收并没有回收上次的空间,其中变量值依然存在,如果不重新赋值,必然出现延用上次值的现象。

所以,解决办法就是在线程结束前把ThreadStatic变量清空。

再看结果:

第0次循环, i值:0,线程ID:10

第3次循环, i值:3,线程ID:12

第4次循环, i值:4,线程ID:10

第1次循环, i值:1,线程ID:11

第5次循环, i值:5,线程ID:12

第6次循环, i值:6,线程ID:10

第9次循环, i值:9,线程ID:10

第8次循环, i值:8,线程ID:12

第13次循环, i值:13,线程ID:12

......

这次就正常了。

不过,有没有办法可以统一对线程结束后进行处理呢,把所有这种变更重置一下,目前还没找到,希望大神们弄过的给个意见。

谈谈ThreadStatic的更多相关文章

  1. 【原】谈谈对Objective-C中代理模式的误解

    [原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...

  2. 谈谈一些有趣的CSS题目(十二)-- 你该知道的字体 font-family

    开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...

  3. 谈谈一些有趣的CSS题目(十一)-- reset.css 知多少?

    开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...

  4. 谈谈一些有趣的CSS题目(三)-- 层叠顺序与堆栈上下文知多少

    开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...

  5. 谈谈如何使用Netty开发实现高性能的RPC服务器

    RPC(Remote Procedure Call Protocol)远程过程调用协议,它是一种通过网络,从远程计算机程序上请求服务,而不必了解底层网络技术的协议.说的再直白一点,就是客户端在不必知道 ...

  6. 谈谈一些有趣的CSS题目(二)-- 从条纹边框的实现谈盒子模型

    开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...

  7. 谈谈一些有趣的CSS题目(四)-- 从倒影说起,谈谈 CSS 继承 inherit

    开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...

  8. 谈谈一些有趣的CSS题目(五)-- 单行居中,两行居左,超过两行省略

    开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...

  9. 谈谈一些有趣的CSS题目(六)-- 全兼容的多列均匀布局问题

    开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...

随机推荐

  1. TCP通讯处理粘包详解

    TCP通讯处理粘包详解 一般所谓的TCP粘包是在一次接收数据不能完全地体现一个完整的消息数据.TCP通讯为何存在粘包呢?主要原因是TCP是以流的方式来处理数据,再加上网络上MTU的往往小于在应用处理的 ...

  2. ASP.NET Web API的核心对象:HttpController

    ASP.NET Web API的核心对象:HttpController 对于ASP.NET Web API来说,所谓的Web API定义在继承自ApiController的类中,可能ApiContro ...

  3. IOS中KVO模式的解析与应用

    IOS中KVO模式的解析与应用 最近老翁在项目中多处用到了KVO,深感这种模式的好处.现总结如下: 一.概述 KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修 ...

  4. C++中#和##的特殊使用

    1.用#号将输入的内容转换为字符串. 用##号将两个参数合并. #include <iostream> using namespace std; //将输入的内容转换成字符串 #defin ...

  5. php+redis实现多台服务器内网存储session并读取

    大型网站由于大并发的问题会导致系统出现诡异的崩溃性问题这着实让人很是蛋疼,首先考虑的就是负载均衡服务器来处理这个,当然数据库的性能也是非常非常重要的,今天就说下在负载均衡情况下对于session这个问 ...

  6. spring mvc下shiro的session,request等问题

    最近的一个项目使用的是spring mvc,权限框架使用的是shiro. 不过有一个问题一直困扰着我,现在的session到底是谁的session,是servlet的还是shiro的. 于是我把spr ...

  7. 使用prismjs为网站添加代码高亮功能

    prismjs 是一款轻量.可扩展的代码语法高亮库,使用现代化的 Web 标准构建,使用 Prismjs 可以快速为网站添加代码高亮功能,支持超过113中编程语言,还支持多种插件,是简洁.高效的代码高 ...

  8. Altium Designer 快速修改板子形状为Keep-out layer大小

    Altium Designer 快速修改板子形状为Keep-out layer大小 1,切换到 Keep-out layer层, 2,选择层,快捷键为S+Y: 3,设计>>板子形状> ...

  9. [HMLY]13.请谨慎使用 @weakify 和 @strongify

    前言 相信大部分见过 @weakify 和 @strongify 的开发者都会喜欢上这两个宏.但是很多人只知道它的强大威力,却没有意识到在特定环境下的危险性. 本文将通过代码测试的方式告诉读者,如何正 ...

  10. mongo数据库时间存储的问题

    题记:项目中要加的内容,可以实现对设备的预定,被某个用户预定后的设备就不能再被其他用户所使用了,用户预定的时候就需要输入预定时间,web前端用到了boostrap的date的一个插件,非常好用,接下来 ...