码迷,mamicode.com
首页 > 其他好文 > 详细

code

时间:2017-01-01 18:54:52      阅读:126      评论:0      收藏:0      [点我收藏+]

标签:key   ado   local   als   etc   sys   new t   byte   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

标签:key   ado   local   als   etc   sys   new t   byte   code   

原文地址:http://www.cnblogs.com/humble/p/6241322.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!