ThreadLocal<T>的是否有设计问题

一、吐槽

ThreadLocal<T>明显是.NET从JAVA中来的一个概念,但是这种设计是否出现了问题.

很明显,在JAVA中threadLocal直接是Thread的成员,当然随着thread这个宿主而存在.

但.NET中对于ThreadLocal<T>的设计明显独立于Thread之外(当然你可以说内部有关联)

,起最终结果是ThreadLocal<T>所产生的对象不会随着线程的终止而释放.

二、问题代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
/*
 * 由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);
        }
    }
}

四、运行结果内存不释

 

哪位大侠对此有深入研究,求赐教.

 

posted @   异地远程联网技术  阅读(1256)  评论(1编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
历史上的今天:
2012-12-31 Moon.Orm
点击右上角即可分享
微信分享提示