ThreadLocal<T>的是否有设计问题
一、吐槽
ThreadLocal<T>明显是.NET从JAVA中来的一个概念,但是这种设计是否出现了问题.
很明显,在JAVA中threadLocal直接是Thread的成员,当然随着thread这个宿主而存在.
但.NET中对于ThreadLocal<T>的设计明显独立于Thread之外(当然你可以说内部有关联)
,起最终结果是ThreadLocal<T>所产生的对象不会随着线程的终止而释放.
二、问题代码
/*
* 由SharpDevelop创建。
* 用户: qsmy
* 日期: 2016/12/31
* 时间: 9:31
*
* 要改变这种模板请点击 工具|选项|代码编写|编辑标准头文件
*/
using System;
using System.Threading; namespace ThreadLocalTest
{
public class MyObject
{
public static readonly ThreadLocal<MyObject> threadLocal
= new ThreadLocal<MyObject>(true); public static MyObject GetCurrentThreadMyObject(String name)
{
if (threadLocal.Value == null) {
threadLocal.Value = new MyObject(name);
}
return threadLocal.Value;
} String _name;
public byte[] _bs;
public MyObject(String name)
{
_name = name;
Console.WriteLine("创建MyObject.name=" + name);
_bs=new byte[(1024*1024*500)];
for (int i = 0; i < _bs.Length; i++) {
_bs[i]=3;
}
}
~MyObject()
{
Console.WriteLine("析构MyObject.name=" + _name);
}
public void Dispose()
{
threadLocal.Value = null;
threadLocal.Values.Clear();
//Console.WriteLine(MyObject.threadLocal.Values.Count);
}
}
class Program
{ public static void Main(string[] args)
{ Thread th1 = new Thread((state) => {
var obj = MyObject.GetCurrentThreadMyObject("obj1");
obj.ToString();
Console.WriteLine("t1.id=" + Thread.CurrentThread.ManagedThreadId); obj.Dispose();
Thread.CurrentThread.Abort();
});
th1.Start(); Thread th2 = new Thread((state) => {
var obj = MyObject.GetCurrentThreadMyObject("obj2");
obj.ToString();
Console.WriteLine("t2.id=" + Thread.CurrentThread.ManagedThreadId);
obj.Dispose();
Thread.CurrentThread.Abort();
});
th2.Start(); Thread.Sleep(20000);
Console.WriteLine(th1.ThreadState); Console.ReadKey(true);
}
}
}
四、运行结果内存不释

哪位大侠对此有深入研究,求赐教.
ThreadLocal<T>的是否有设计问题的更多相关文章
- ThreadLocal的设计与使用(原理篇)
在jdk1.2推出时开始支持java.lang.ThreadLocal.在J2SE5.0中的声明为: public class ThreadLocal<T> exte ...
- Java_解密ThreadLocal
概述 相信读者在网上也看了很多关于ThreadLocal的资料,很多博客都这样说:ThreadLocal为解决多线程程序的并发问题提供了一种新的思路:ThreadLocal的目的是为了解决多线程访问资 ...
- 深入学习ThreadLocal原理
上文我们学习了ThreadLocal的基本用法以及基本原理,ThreadLocal中的方法并不多,基本用到的也就get.set.remove等方法,但是其核心逻辑还是在定义在ThreadLocal内部 ...
- 菜鸟之路——Java并发(二)ThreadLocal
一.什么是ThreadLocal ThreadLocal,非常多地方叫做线程本地变量,也有些地方叫做线程本地存储.事实上意思几乎相同.非常多博客都这样说:ThreadLocal为解决多线程程序 ...
- SOFA 源码分析 — 链路数据透传
前言 SOFA-RPC 支持数据链路透传功能,官方解释: 链路数据透传功能支持应用向调用上下文中存放数据,达到整个链路上的应用都可以操作该数据. 使用方式如下,可分别向链路的 request 和 re ...
- java并发系列 - 第28天:实战篇,微服务日志的伤痛,一并帮你解决掉
这是java高并发系列第28篇文章. 环境:jdk1.8. 本文内容 日志有什么用? 日志存在的痛点? 构建日志系统 日志有什么用? 系统出现故障的时候,可以通过日志信息快速定位问题,修复bug,恢复 ...
- Java高并发系列——检视阅读
Java高并发系列--检视阅读 参考 java高并发系列 liaoxuefeng Java教程 CompletableFuture AQS原理没讲,需要找资料补充. JUC中常见的集合原来没讲,比如C ...
- Java中的闪光点:ThreadLocal是线程Thead的局部变量,可替代同步机制的设计,值得学习和研究
线程局部变量ThreadLocal,是Java支持的一种线程安全机制,目的是解决多线程的并发问题. 具体来讲,就是多个线程访问该实例对象的变量时,该实例对象将其存储为键值对的形式,保证各个线程(键)分 ...
- 优雅的设计单线程范围内的数据共享(ThreadLocal)
单线程范围内数据共享使用ThreadLocal /** * @Description TODO * @author zhanghw@chinatelecom.cn * @since 2015年12月1 ...
随机推荐
- 从零开始编写自己的C#框架(24)——测试
导航 1.前言 2.不堪回首的开发往事 3.测试推动开发的成长——将Bug消灭在自测中 4.关于软件测试 5.制定测试计划 6.编写测试用例 7.执行测试用例 8.发现并提交Bug 9.开发人员修复B ...
- AFNetworking 3.0 源码解读 总结(干货)(上)
养成记笔记的习惯,对于一个软件工程师来说,我觉得很重要.记得在知乎上看到过一个问题,说是人类最大的缺点是什么?我个人觉得记忆算是一个缺点.它就像时间一样,会自己消散. 前言 终于写完了 AFNetwo ...
- 2014年暑假c#学习笔记目录
2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...
- 基于NPOI的Excel数据导入
从Excel导入数据最令人头疼的是数据格式的兼容性,特别是日期类型的兼容性.为了能够无脑导入日期,折腾了一天的NPOI.在经过测试确实可以导入任意格式的合法日期后,写下这篇小文,与大家共享.完整代码请 ...
- SuperMap-iServer-单点登录功能验证(CAS)
SuperMap-iServer-单点登录功能验证(CAS) 1.测试目的: 验证SuperMap-iServer使用CAS单点登录的功能是否正常. 2.测试环境: SuperMap-iServer8 ...
- iOS--->微信支付小结
iOS--->微信支付小结 说起支付,除了支付宝支付之外,微信支付也是我们三方支付中最重要的方式之一,承接上面总结的支付宝,接下来把微信支付也总结了一下 ***那么首先还是由公司去创建并申请使用 ...
- Handler
1.1 继承AbstractController优点:能定制请求方式 package cn.happyl.controller; import javax.servlet.http.HttpServl ...
- 《Walking the callstack(转载)》
本文转载自:https://www.codeproject.com/articles/11132/walking-the-callstack Download demo project with so ...
- ReactNative&weex&DeviceOne对比
React Native出来有一段时间了,国内的weex和deviceone是近期发布的,我可以说从2011年就开始关注快速开发的跨平台平台技术了,接触过phoneGap.数字天堂.appcan等早期 ...
- C#将Word转换成PDF方法总结(基于Office和WPS两种方案)
有时候,我们需要在线上预览word文档,当然我们可以用NPOI抽出Word中的文字和表格,然后显示到网页上面,但是这样会丢失掉Word中原有的格式和图片.一个比较好的办法就是将word转换成pdf,然 ...