using System;
using System.Threading;

namespace ThreadLocalTest
{
    public class MyObject
    {
        
        public static MyObject GetCurrentThreadMyObject(String name)
        {
            if (CurrentThread<MyObject>.ThreadLocal.Value == null) {
                CurrentThread<MyObject>.ThreadLocal.Value = new MyObject(name);
            }
            return CurrentThread<MyObject>.ThreadLocal.Value;
        }
        
        String _name;
        byte[] _bs;
        public MyObject(String name)
        {
            _name = name;
            Console.WriteLine("create MyObject.name=" + name);
            _bs = new byte[(1024 * 1024 * 100)];
            for (int i = 0; i < _bs.Length; i++) {
                _bs[i] = 3;
            }
        }
        ~MyObject()
        {
            //    Dispose();
            Console.WriteLine("~MyObject");
            
        }
        
    }
    
    public class CurrentThread<T>
    {
        public static readonly ThreadLocal<T> ThreadLocal
            = new ThreadLocal<T>(true);
    }
    class Program
    {
        
        static void test1()
        {
            Thread th1 = new Thread((state) => {
                                        var obj = MyObject.GetCurrentThreadMyObject("obj1");
                                        var obj2 = MyObject.GetCurrentThreadMyObject("obj1");
                                        Console.WriteLine(object.ReferenceEquals(obj,obj2));
                                        Console.WriteLine("t1.id=" + Thread.CurrentThread.ManagedThreadId);
                                        CurrentThread<MyObject>.ThreadLocal.Value=null; CurrentThread<MyObject>.ThreadLocal.Values.Clear();

//GC.Collect();
                                        
                                        //Thread.CurrentThread.Abort();
                                    });
            th1.Start();
            
            
            Thread th2 = new Thread((state) => {
                                        var obj = MyObject.GetCurrentThreadMyObject("obj2");
                                        var obj2 = MyObject.GetCurrentThreadMyObject("obj2");
                                        Console.WriteLine(object.ReferenceEquals(obj,obj2));
                                        Console.WriteLine("t2.id=" + Thread.CurrentThread.ManagedThreadId);
                                        CurrentThread<MyObject>.ThreadLocal.Value=null;
                                        CurrentThread<MyObject>.ThreadLocal.Values.Clear();
                                        //    GC.Collect();
                                        ;
                                        //Thread.CurrentThread.Abort();
                                    });
            th2.Start();
            
            Thread th3 = new Thread((state) => {
                                        var obj = MyObject.GetCurrentThreadMyObject("obj3");
                                        var obj2 = MyObject.GetCurrentThreadMyObject("obj3");
                                        Console.WriteLine(object.ReferenceEquals(obj,obj2));
                                        Console.WriteLine("t3.id=" + Thread.CurrentThread.ManagedThreadId);
                                        CurrentThread<MyObject>.ThreadLocal.Value=null;
                                        CurrentThread<MyObject>.ThreadLocal.Values.Clear();
                                        //GC.Collect();
                                        ;
                                        //Thread.CurrentThread.Abort();
                                    });
            th3.Start();
            
            Thread.Sleep(8000);GC.Collect();
            GC.Collect(2);
            
            
            
        }
        
        
        
        
        public static void Main(string[] args)
        {
            
            test1();
            
            Console.ReadKey(true);
        }
    }
}

code的更多相关文章

  1. Visual Studio Code 代理设置

    Visual Studio Code (简称 VS Code)是由微软研发的一款免费.开源的跨平台文本(代码)编辑器,在十多年的编程经历中,我使用过非常多的的代码编辑器(包括 IDE),例如 Fron ...

  2. 我们是怎么做Code Review的

    前几天看了<Code Review 程序员的寄望与哀伤>,想到我们团队开展Code Review也有2年了,结果还算比较满意,有些经验应该可以和大家一起分享.探讨.我们为什么要推行Code ...

  3. Code Review 程序员的寄望与哀伤

    一个程序员,他写完了代码,在测试环境通过了测试,然后他把它发布到了线上生产环境,但很快就发现在生产环境上出了问题,有潜在的 bug. 事后分析,是生产环境的一些微妙差异,使得这种 bug 场景在线下测 ...

  4. 从Script到Code Blocks、Code Behind到MVC、MVP、MVVM

    刚过去的周五(3-14)例行地主持了技术会议,主题正好是<UI层的设计模式——从Script.Code Behind到MVC.MVP.MVVM>,是前一天晚上才定的,中午花了半小时准备了下 ...

  5. 在Visual Studio Code中配置GO开发环境

    一.GO语言安装 详情查看:GO语言下载.安装.配置 二.GoLang插件介绍 对于Visual Studio Code开发工具,有一款优秀的GoLang插件,它的主页为:https://github ...

  6. 代码的坏味道(14)——重复代码(Duplicate Code)

    坏味道--重复代码(Duplicate Code) 重复代码堪称为代码坏味道之首.消除重复代码总是有利无害的. 特征 两个代码片段看上去几乎一样. 问题原因 重复代码通常发生在多个程序员同时在同一程序 ...

  7. http status code

    属于转载 http status code:200:成功,服务器已成功处理了请求,通常这表示服务器提供了请求的网页 404:未找到,服务器未找到 201-206都表示服务器成功处理了请求的状态代码,说 ...

  8. Visual Studio Code——Angular2 Hello World 之 2.0

    最近看到一篇用Visual Studio Code开发Angular2的文章,也是一篇入门教程,地址为:使用Visual Studio Code開發Angular 2專案.这里按部就班的做了一遍,感觉 ...

  9. WebStorm 2016 最新版激活(activation code方式)

    WebStorm 2016 最新版激活(activation code方式) WebStorm activation code WebStorm 最新版本激活方式: 今天下载最新版本的WebStorm ...

  10. docker4dotnet #3 在macOS上使用Visual Studio Code和Docker开发asp.net core和mysql应用

    .net猿遇到了小鲸鱼,觉得越来越兴奋.本来.net猿只是在透过家里那田子窗看外面的世界,但是看着海峡对岸的苹果园越来越茂盛,实在不想再去做一只宅猿了.于是,.net猿决定搭上小鲸鱼的渡轮到苹果园去看 ...

随机推荐

  1. 有朋友问了数据库ID不连续,怎么获取上一篇和下一篇的文章?(不是所有情况都适用)

    呃 (⊙o⊙)…,逆天好久没写SQL了,EF用的时间长了,SQL都不怎么熟悉了......[SQL水平比较菜,大牛勿喷] 方法很多种,说个最常见的处理 因为id是自增长的,所以一般情况下下一篇文章的I ...

  2. AFNetworking 3.0 源码解读(九)之 AFNetworkActivityIndicatorManager

    让我们的APP像艺术品一样优雅,开发工程师更像是一名匠人,不仅需要精湛的技艺,而且要有一颗匠心. 前言 AFNetworkActivityIndicatorManager 是对状态栏中网络激活那个小控 ...

  3. 你所能用到的BMP格式介绍

    原理篇: 一.编码的意义. 让我们从一个简单的问题开始,-2&-255(中间的操作符表示and的意思)的结果是多少,这个很简单的问题,但是能够写出解答过程的人并不 多.这个看起来和图片格式没有 ...

  4. 电信计费业务:预后融合OCS到底应该实扣还是虚扣?

    引入OCS的初衷之一是为了让计费系统能够参与到用户的通讯控制中来,也就是所谓的实时信控.用户在没有余额时,通讯就会被停止,不会造成"天价欠费 ",一方面保障用户的利益,一方面也保障 ...

  5. Android中通过ActionBar为标题栏添加搜索以及分享视窗

    在Android3.0之后,Google对UI导航设计上进行了一系列的改革,其中有一个非常好用的新功能就是引入的ActionBar,他用于取代3.0之前的标题栏,并提供更为丰富的导航效果.Action ...

  6. 使用gulp解决RequireJS项目前端缓存问题(二)

    1.前言 这一节,我们主要解决在上一节<使用gulp解决RequireJSs项目前端缓存问题(一)>末尾提到的几个问题: 对通过require-config.js引入的js文件修改后,没有 ...

  7. Atitit.你这些项目不都是模板吗?不是原创  集成和整合的方式大总结

    Atitit.你这些项目不都是模板吗?不是原创  集成和整合的方式大总结 1.1. 乔布斯的名言:创新即整合(Creativity is just connecting things).1 1.2. ...

  8. 使用HEXO快速建站

    先安好npm,请参照:http://max.cszi.com/archives/482 打开网站:https://hexo.io/   npm install hexo-cli -g hexo ini ...

  9. 1 selenium3.0.1无法打开火狐浏览器

    [问题描述] 1.配置selenium3.0和java后,尝试打开火狐浏览器,提示缺少geckodriver驱动. [解决方案] 1.在http://www.seleniumhq.org/downlo ...

  10. openfire的组件(Component)开发

    在之前的文章<Openfire阶段实践总结>中提到过一种openfire的扩展模式Compoent.本文将主要探讨对这种模式的应用与开发方法. 内部与外部组件介绍 在openfire中的许 ...