一、吐槽

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. Ajax 概念 分析 举例

    Ajax是结合了访问数据库,数据访问,Jquery 可以做页面局部刷新或者说是页面不刷新,我可以让页面不刷新,仅仅是数据的刷新,没有频繁的刷页面,是现在比较常用的一种方式做页面那么它是怎么实现页面无刷 ...

  2. MVC Core 网站开发(Ninesky) 2、栏目

    栏目是网站的常用功能,按照惯例栏目分常规栏目,单页栏目,链接栏目三种类型,这次主要做添加栏目控制器和栏目模型两个内容,控制器这里会用到特性路由,模型放入业务逻辑层中(网站计划分数据访问.业务逻辑和We ...

  3. ubuntu如何安装nodejs最新版 本

    如何正确的安装nodejs? 我们可以先安装nvm, git clone https://github.com/creationix/nvm.git ~/.nvm 然后打开 ~/.bashrc ,   ...

  4. 关于font-family

    在设置页面字体的时候,你会发现在 font-family 属性中会设置好多个字体,想看懂它们都是什么字体吗?不好意思,我不是搞设计的,我也不知道.那么,现在写的东西,只是对于一个前端人员来说,要了解的 ...

  5. ASP.NET中常用的优化性能的方法

    1. 数据库访问性能优化 数据库的连接和关闭 访问数据库资源需要创建连接.打开连接和关闭连接几个操作.这些过程需要多次与数据库交换信息以通过身份验证,比较耗费服务器资源.ASP.NET中提供了连接池( ...

  6. SSH框架和Redis的整合(2)

    5. 添加功能的实现 新建一个Action:RClasAction,实现向Redis添加课程数据,并同步到MySQL. package com.school.action; import java.u ...

  7. 无法访问org.springframework.core.NestedRuntimeException 找不到org.springframework.core.NestedRuntimeException的类文件

    在学习springAOP时,出现如下异常: 无法访问org.springframework.core.NestedRuntimeException 找不到org.springframework.cor ...

  8. Spring注解

    AccountController .java Java代码   1.        /** 2.         * 2010-1-23 3.         */ 4.        packag ...

  9. Node.js学习笔记——Node.js开发Web后台服务

    一.简介 Node.js 是一个基于Google Chrome V8 引擎的 JavaScript 运行环境.Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高效.Node.j ...

  10. Android使用静默安装时碰见的问题

    升级时碰见的异常 private void installPackage(String appName,final File apk) { if (!apk.exists()) { setHasNew ...