一、吐槽

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>的是否有设计问题的更多相关文章

  1. ThreadLocal的设计与使用(原理篇)

    在jdk1.2推出时开始支持java.lang.ThreadLocal.在J2SE5.0中的声明为:            public class ThreadLocal<T> exte ...

  2. Java_解密ThreadLocal

    概述 相信读者在网上也看了很多关于ThreadLocal的资料,很多博客都这样说:ThreadLocal为解决多线程程序的并发问题提供了一种新的思路:ThreadLocal的目的是为了解决多线程访问资 ...

  3. 深入学习ThreadLocal原理

    上文我们学习了ThreadLocal的基本用法以及基本原理,ThreadLocal中的方法并不多,基本用到的也就get.set.remove等方法,但是其核心逻辑还是在定义在ThreadLocal内部 ...

  4. 菜鸟之路——Java并发(二)ThreadLocal

      一.什么是ThreadLocal   ThreadLocal,非常多地方叫做线程本地变量,也有些地方叫做线程本地存储.事实上意思几乎相同.非常多博客都这样说:ThreadLocal为解决多线程程序 ...

  5. SOFA 源码分析 — 链路数据透传

    前言 SOFA-RPC 支持数据链路透传功能,官方解释: 链路数据透传功能支持应用向调用上下文中存放数据,达到整个链路上的应用都可以操作该数据. 使用方式如下,可分别向链路的 request 和 re ...

  6. java并发系列 - 第28天:实战篇,微服务日志的伤痛,一并帮你解决掉

    这是java高并发系列第28篇文章. 环境:jdk1.8. 本文内容 日志有什么用? 日志存在的痛点? 构建日志系统 日志有什么用? 系统出现故障的时候,可以通过日志信息快速定位问题,修复bug,恢复 ...

  7. Java高并发系列——检视阅读

    Java高并发系列--检视阅读 参考 java高并发系列 liaoxuefeng Java教程 CompletableFuture AQS原理没讲,需要找资料补充. JUC中常见的集合原来没讲,比如C ...

  8. Java中的闪光点:ThreadLocal是线程Thead的局部变量,可替代同步机制的设计,值得学习和研究

    线程局部变量ThreadLocal,是Java支持的一种线程安全机制,目的是解决多线程的并发问题. 具体来讲,就是多个线程访问该实例对象的变量时,该实例对象将其存储为键值对的形式,保证各个线程(键)分 ...

  9. 优雅的设计单线程范围内的数据共享(ThreadLocal)

    单线程范围内数据共享使用ThreadLocal /** * @Description TODO * @author zhanghw@chinatelecom.cn * @since 2015年12月1 ...

随机推荐

  1. React使用antd Table生成层级多选组件

    一.需求 用户对不同的应用需要有不同的权限,用户一般和角色关联在一起,新建角色的时候会选择该角色对应的应用,然后对应用分配权限.于是写了一种实现的方式.首先应用是一个二级树,一级表示的是应用分组,二级 ...

  2. 伪共享(false sharing),并发编程无声的性能杀手

    在并发编程过程中,我们大部分的焦点都放在如何控制共享变量的访问控制上(代码层面),但是很少人会关注系统硬件及 JVM 底层相关的影响因素.前段时间学习了一个牛X的高性能异步处理框架 Disruptor ...

  3. C#为IE编写BHO插件心得

    啥是BHO,其实大家都用过,没听过只是没在意而已,来张图你就知道是什么了 是不是很熟悉,就是这么个玩意~~ 先说说我要用来干嘛~我们有个库,里面数据很全面,但是某个部门需要在第三方的B/S系统录入某些 ...

  4. H5坦克大战之【玩家控制坦克移动2】

    周一没有看圣诞大战,这几天比较忙也没有看赛后的报道,今天就先不扯NBA,随便扯扯自己.昨天在电脑里找东西的时候翻到以前兼职健身教练时的照片,思绪一下子回到学生时代,脑子久久换不过来.现在深深觉得健身和 ...

  5. 你真的会玩SQL吗?之逻辑查询处理阶段

    你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...

  6. angular2之前端篇—1(node服务器分支)

    上一篇.net core和angular2之前端篇-1 使用的是dotnet模板.之所以用它,因为想用他写webapi,但是写道下一篇的时候遇到点问题,所以先写个分支测试一下.这次是用Node作为服务 ...

  7. SQLServer 各版本区别

    SQLServer 2012 新特性 通过AlwaysOn实现各种高可用级别 通过列存储索引技术实现超快速的查询,其中星型链接查询及相似查询的性能提升幅度可高达100倍,同时支持超快速的全文查询 通过 ...

  8. (转) 将ASP.NET Core应用程序部署至生产环境中(CentOS7)

    原文链接: http://www.cnblogs.com/ants/p/5732337.html 阅读目录 环境说明 准备你的ASP.NET Core应用程序 安装CentOS7 安装.NET Cor ...

  9. 简单Linux命令学习笔记

    1.查看进程 ps -ef | grep 关键字       /*关键字为服务名*/ netstat -unltp | grep 关键字        /*关键字为服务名或者是端口均可*/ 2.杀死进 ...

  10. 【腾讯Bugly干货分享】微信终端跨平台组件 mars 系列(二) - 信令传输超时设计

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:http://mp.weixin.qq.com/s/9DJxipJaaBC8yC-buHgnTQ 作者简介: ...