code
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的更多相关文章
- Visual Studio Code 代理设置
Visual Studio Code (简称 VS Code)是由微软研发的一款免费.开源的跨平台文本(代码)编辑器,在十多年的编程经历中,我使用过非常多的的代码编辑器(包括 IDE),例如 Fron ...
- 我们是怎么做Code Review的
前几天看了<Code Review 程序员的寄望与哀伤>,想到我们团队开展Code Review也有2年了,结果还算比较满意,有些经验应该可以和大家一起分享.探讨.我们为什么要推行Code ...
- Code Review 程序员的寄望与哀伤
一个程序员,他写完了代码,在测试环境通过了测试,然后他把它发布到了线上生产环境,但很快就发现在生产环境上出了问题,有潜在的 bug. 事后分析,是生产环境的一些微妙差异,使得这种 bug 场景在线下测 ...
- 从Script到Code Blocks、Code Behind到MVC、MVP、MVVM
刚过去的周五(3-14)例行地主持了技术会议,主题正好是<UI层的设计模式——从Script.Code Behind到MVC.MVP.MVVM>,是前一天晚上才定的,中午花了半小时准备了下 ...
- 在Visual Studio Code中配置GO开发环境
一.GO语言安装 详情查看:GO语言下载.安装.配置 二.GoLang插件介绍 对于Visual Studio Code开发工具,有一款优秀的GoLang插件,它的主页为:https://github ...
- 代码的坏味道(14)——重复代码(Duplicate Code)
坏味道--重复代码(Duplicate Code) 重复代码堪称为代码坏味道之首.消除重复代码总是有利无害的. 特征 两个代码片段看上去几乎一样. 问题原因 重复代码通常发生在多个程序员同时在同一程序 ...
- http status code
属于转载 http status code:200:成功,服务器已成功处理了请求,通常这表示服务器提供了请求的网页 404:未找到,服务器未找到 201-206都表示服务器成功处理了请求的状态代码,说 ...
- Visual Studio Code——Angular2 Hello World 之 2.0
最近看到一篇用Visual Studio Code开发Angular2的文章,也是一篇入门教程,地址为:使用Visual Studio Code開發Angular 2專案.这里按部就班的做了一遍,感觉 ...
- WebStorm 2016 最新版激活(activation code方式)
WebStorm 2016 最新版激活(activation code方式) WebStorm activation code WebStorm 最新版本激活方式: 今天下载最新版本的WebStorm ...
- docker4dotnet #3 在macOS上使用Visual Studio Code和Docker开发asp.net core和mysql应用
.net猿遇到了小鲸鱼,觉得越来越兴奋.本来.net猿只是在透过家里那田子窗看外面的世界,但是看着海峡对岸的苹果园越来越茂盛,实在不想再去做一只宅猿了.于是,.net猿决定搭上小鲸鱼的渡轮到苹果园去看 ...
随机推荐
- js复杂对象和简单对象的简单转化
var course = { teacher :{ teacherId:001, teacherName:"王" }, course : { courseId : 120, cou ...
- SQL Server-表表达式基础回顾(二十四)
前言 从这一节开始我们开始进入表表达式章节的学习,Microsoft SQL Server支持4种类型的表表达式:派生表.公用表表达式(CTE).视图.内嵌表值函数(TVF).简短的内容,深入的理解, ...
- Redis的简单动态字符串实现
Redis 没有直接使用 C 语言传统的字符串表示(以空字符结尾的字符数组,以下简称 C 字符串), 而是自己构建了一种名为简单动态字符串(simple dynamic string,sds)的抽象类 ...
- SharpMap简析
1.背景 因为项目需求,需要基于开源项目来对SHP进行相关操作.涉及到的主要功能就是加载SHP读取其中的属性信息和几何信息.于是选择了Sharpmap来进行,在使用中对其相关功能做了初步了解,做个总结 ...
- Spring之初体验
Spring之初体验 Spring是一个轻量级的Java Web开发框架,以IoC(Inverse of Control 控制反转)和 ...
- java中Action层、Service层和Dao层的功能区分
Action/Service/DAO简介: Action是管理业务(Service)调度和管理跳转的. Service是管理具体的功能的. Action只负责管理,而Service负责实施. DAO只 ...
- Android 关于ijkplayer
基于ijkplayer封装支持简单界面UI定制的视频播放器 可以解析ts格式的so库 怎样编译出可以解析ts等格式的so库?就是编译的时候需要在哪一步修改配置? 一些电视台的m3u8 CCTV1综合, ...
- 2DToolkit官方文档中文版打地鼠教程(三):Sprite Collections 精灵集合
这是2DToolkit官方文档中 Whack a Mole 打地鼠教程的译文,为了减少文中过多重复操作的翻译,以及一些无必要的句子,这里我假设你有Unity的基础知识(例如了解如何新建Sprite等) ...
- Fedora 22中的RPM软件包管理工具
Introduction The RPM Package Manager (RPM) is an open packaging system that runs on Fedora as well a ...
- Spring集成MyBatis
本文原创,原文地址为http://www.cnblogs.com/fengzheng/p/5045105.html 如果觉得Hibernate不够灵活,可以尝试用Mybatis.相比于Hibernat ...