谈谈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 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...
随机推荐
- jQuery中的事件监听方式及异同点
jQuery中的事件监听方式及异同点 作为全球最知名的js框架之一,jQuery的火热程度堪称无与伦比,简单易学的API再加丰富的插件,几乎是每个前端程序员的必修课.从读<锋利的jQuery&g ...
- 瀑布流,五大插件一个都不少Bootstrap+jQuery+Masonry+imagesLoaded+Lightbox!
纯手工打造漂亮的瀑布流,五大插件一个都不少Bootstrap+jQuery+Masonry+imagesLoaded+Lightbox! 前两天写的文章<纯手工打造漂亮的垂直时间轴,使用最简 ...
- LigerUI权限系统之组织结构
先上图,再看代码.组织结构界面 组织结构添加: 组织结构修改: 组织结构删除: 我在做这个页面的时候treegrid 的远程数据加载让我很头痛,从LigerUI官网提供的Demo来看,它是根据json ...
- HTML5学习+javascript学习:打飞机游戏简介以及Model层
本着好记性不如烂博客以及分享成功的喜悦和分享失败的苦楚,今天我来分享下一个练手项目:打飞机游戏~从小就自己想做游戏,可是一直没有机会.HTML5给了我们这个平台,这个平台可以有很多以前想都不敢想的东西 ...
- jQuery Mobile (整合版)
jQuery Mobile (整合版) 前言 为了方便大家看的方便,我这里将这几天的东西整合一下发出. 里面的例子请使用手机浏览器查看. 什么是jQuery Mobile? jquery mobile ...
- How to use USB 3G dongle/stick Huawei E169/E620/E800 ( Chip used Qualcomm e1750) in Linux (China and world)
Using this 3G module in Linux is so great. I want it. So I made it. The 3G dongle of Huawei E169/E62 ...
- vps使用(centos)
javaweb开发,vps来做个人测试 首先配置vps(centos) 1.安装javeweb环境 用ssh远程服务器后,中文乱码,因为ssh的字符集和服务器的字符集不一致,服务器是utf-8,可以通 ...
- Android中使用开源框架PagerSlidingTabStrip实现导航标题
此开源框架官网地址:https://github.com/astuetz/PagerSlidingTabStrip 可以理解为配合ViewPager使用的交互式页面指示器控件. 话不多说,先上效果图: ...
- 正则表达式之js检验密码强度
最近一直在做通行证项目,里面的注册模块中输入密码需要显示密码强度(低中高).今天就把做的效果给大家分享下,代码没有网上搜索的那么复杂,能够满足一般的需求. html 代码如下: <!DOCTYP ...
- 【CSS学习笔记】背景图片
直接看代码: background: blue; /*页面背景为蓝色,很简单的代码*/background-image:url(small.jpg); /*页面背景是名字叫small.jpg的图片*/ ...