谈谈ThreadStatic
可能经常做多线程、线程池的童鞋早就知道这种问题,原谅我一直对线程研究不深。
这个东西好像出现有一段时间了,不过最近我才用到,做的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的更多相关文章
- 【原】谈谈对Objective-C中代理模式的误解
[原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...
- 谈谈一些有趣的CSS题目(十二)-- 你该知道的字体 font-family
开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...
- 谈谈一些有趣的CSS题目(十一)-- reset.css 知多少?
开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...
- 谈谈一些有趣的CSS题目(三)-- 层叠顺序与堆栈上下文知多少
开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...
- 谈谈如何使用Netty开发实现高性能的RPC服务器
RPC(Remote Procedure Call Protocol)远程过程调用协议,它是一种通过网络,从远程计算机程序上请求服务,而不必了解底层网络技术的协议.说的再直白一点,就是客户端在不必知道 ...
- 谈谈一些有趣的CSS题目(二)-- 从条纹边框的实现谈盒子模型
开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...
- 谈谈一些有趣的CSS题目(四)-- 从倒影说起,谈谈 CSS 继承 inherit
开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...
- 谈谈一些有趣的CSS题目(五)-- 单行居中,两行居左,超过两行省略
开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...
- 谈谈一些有趣的CSS题目(六)-- 全兼容的多列均匀布局问题
开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...
随机推荐
- JUC.Condition学习
JUC.Condition学习笔记[附详细源码解析] 目录 Condition的概念 大体实现流程 I.初始化状态 II.await()操作 III.signal()操作 3个主要方法 Conditi ...
- 使用js加载图像和setDataXML()加载数据
使用js加载图像和setDataXML()加载数据 前面一篇对FusionCharts进行了一个简单的介绍,而且建立了我们第一个图形,但是那个是在HTML中使用<OBJECT>和<E ...
- 安全验证之使用摘要认证(digest authentication)
安全验证之使用摘要认证(digest authentication) 在前一篇文章中,主要讨论了使用HTTP基本认证的方法,因为HTTP基本认证的方式决定了它在安全性方面存在很大的问题,所以接下来看看 ...
- Left 、right join使用笔记
用过很多次left join,right join,看到查询出的结果,知道可能是没用left join.或者right join导致的结果,但都是用一次,网上查一次使用规则,学到的东西只是皮毛.今天用 ...
- zoj 1610 Count the Colors(线段树延迟更新)
所谓的懒操作模板题. 学好acm,英语很重要.做题的时候看不明白题目的意思,我还拉着队友一块儿帮忙分析题意.最后确定了是线段树延迟更新果题.我就欣欣然上手敲了出来. 然后是漫长的段错误.... 第一次 ...
- 如何调用在$(function(){ //内部函数代码 });
这个文件主要完成如何调用在jquery内部定义的函数,主要有两种方法 法①: <script type="text/javascript"> $(function() ...
- kubernetes service分析
service type k8s中service主要有三种: ClusterIP: use a cluster-internal IP only - this is the default and i ...
- There is no getter for property named 'userSpAndSp' in 'class com.uauth.beans.UserSpAndSp'
mybatis 报错There is no getter for property named 'userSpAndSp' in 'class com.uauth.beans.UserSpAndSp' ...
- oc之封装与类之间的关系
1. 面向对象的特征-封装? 封装: 现实生活中的封装: 将很多的小东西 塞在1个大口袋里面. 好处: a. 对外部屏蔽. b. 方便管理. 代码的封装: 函数/方法 就是1种封装的体现: 将一段代码 ...
- Promise初体验
想通过回调函数做一个动画效果:三个小球依次运动,第一个小球运动到指定位置后回调第二个小球运动,依次类推,效果如图所示: 到第三个小球到达指定位置再回调,让第二个小球往回移动,直到最后一个小球回到原位: ...