Hashtable lock

using System;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Diagnostics;
using System.Collections;

namespace Test
{
    class Program
    {
        private static Hashtable _hashtable = new Hashtable();
        public static void AddItem1()
        {
            lock (_hashtable.SyncRoot)
            {
                Console.WriteLine("AddItem1()开始添加...    " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));

                for (int i = 10; i < 20; i++)
                {
                    _hashtable.Add(i, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));

                    Thread.Sleep(TimeSpan.FromMilliseconds(1000));
                }

                Console.WriteLine("AddItem1()结束添加...    " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
            }

            Console.WriteLine("AddItem1()退出方法体...  " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\n");
        }
        public static void AddItem11()
        {
            lock (_hashtable.SyncRoot)
            {
                Console.WriteLine("AddItem11()开始添加...   " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));

                for (int i = 50; i < 60; i++)
                {
                    _hashtable.Add(i, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));

                    Thread.Sleep(TimeSpan.FromMilliseconds(1000));
                }

                Console.WriteLine("AddItem11()结束添加...   " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
            }

            Console.WriteLine("AddItem11()退出方法体... " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\n");
        }



        private static Hashtable ht = Hashtable.Synchronized(new Hashtable());
        public static void AddItem2()
        {
            lock (ht)
            {
                Console.WriteLine("AddItem2()开始添加...    " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));

                for (int i = 10; i < 20; i++)
                {
                    ht.Add(i, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));

                    Thread.Sleep(TimeSpan.FromMilliseconds(1000));
                }

                Console.WriteLine("AddItem2()结束添加...    " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
            }

            Console.WriteLine("AddItem2()退出方法体...  " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\n");
        }
        public static void AddItem22()
        {
            lock (ht)
            {
                Console.WriteLine("AddItem22()开始添加...   " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));

                for (int i = 50; i < 60; i++)
                {
                    ht.Add(i, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));

                    Thread.Sleep(TimeSpan.FromMilliseconds(1000));
                }

                Console.WriteLine("AddItem22()结束添加...   " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
            }

            Console.WriteLine("AddItem22()退出方法体... " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\n");
        }


        static void Main()
        {
            Thread t1 = new Thread(new ThreadStart(AddItem1));
            Thread t2 = new Thread(new ThreadStart(AddItem11));

            t1.Start();
            t2.Start();

            t1.Join();
            t2.Join();

            Console.WriteLine("Hashtable _hashtable = new Hashtable();");
            Console.WriteLine(_hashtable.Count.ToString());
            foreach (DictionaryEntry item in _hashtable)
            {
                Console.WriteLine("{0} - {1}", item.Key, item.Value);
            }

            Console.WriteLine("AddItem1执行完成");
            //Console.ReadLine();


            Thread t3 = new Thread(new ThreadStart(AddItem2));
            t3.Start();
            t3.Join();

            Console.WriteLine("t3:" + ht.Count.ToString() + "\n");
            foreach (DictionaryEntry item in ht)
            {
                Console.WriteLine("{0} - {1}", item.Key, item.Value);
            }

            Thread t4 = new Thread(new ThreadStart(AddItem22));
            t4.Start();
            t4.Join();


            Console.WriteLine("\n");

            Console.WriteLine("Hashtable ht = Hashtable.Synchronized(new Hashtable());");
            Console.WriteLine("ht:" + ht.Count.ToString());
            foreach (DictionaryEntry item in ht)
            {
                Console.WriteLine("{0} - {1}", item.Key, item.Value);
            }

            Console.WriteLine("AddItem2执行完成");
            Console.ReadLine();
        }
    }
}

 

打印运行结果:

/*
AddItem1()开始添加...    2016-08-21 16:08:19
AddItem1()结束添加...    2016-08-21 16:08:29
AddItem1()退出方法体...  2016-08-21 16:08:29

AddItem11()开始添加...   2016-08-21 16:08:29
AddItem11()结束添加...   2016-08-21 16:08:39
AddItem11()退出方法体... 2016-08-21 16:08:39

Hashtable _hashtable = new Hashtable();
20
54 - 2016-08-21 16:08:33
13 - 2016-08-21 16:08:22
55 - 2016-08-21 16:08:34
14 - 2016-08-21 16:08:23
56 - 2016-08-21 16:08:35
59 - 2016-08-21 16:08:38
58 - 2016-08-21 16:08:37
57 - 2016-08-21 16:08:36
19 - 2016-08-21 16:08:28
18 - 2016-08-21 16:08:27
17 - 2016-08-21 16:08:26
16 - 2016-08-21 16:08:25
15 - 2016-08-21 16:08:24
51 - 2016-08-21 16:08:30
50 - 2016-08-21 16:08:29
12 - 2016-08-21 16:08:21
11 - 2016-08-21 16:08:20
10 - 2016-08-21 16:08:19
52 - 2016-08-21 16:08:31
53 - 2016-08-21 16:08:32
AddItem1执行完成

AddItem2()开始添加...    2016-08-21 16:08:39
AddItem2()结束添加...    2016-08-21 16:08:49
AddItem2()退出方法体...  2016-08-21 16:08:49

t3:10
16 - 2016-08-21 16:08:45
15 - 2016-08-21 16:08:44
14 - 2016-08-21 16:08:43
13 - 2016-08-21 16:08:42
12 - 2016-08-21 16:08:41
11 - 2016-08-21 16:08:40
10 - 2016-08-21 16:08:39
19 - 2016-08-21 16:08:48
18 - 2016-08-21 16:08:47
17 - 2016-08-21 16:08:46
AddItem22()开始添加... 2016-08-21 16:08:49 AddItem22()结束添加... 2016-08-21 16:08:59 AddItem22()退出方法体... 2016-08-21 16:08:59 Hashtable ht = Hashtable.Synchronized(new Hashtable()); ht:20 54 - 2016-08-21 16:08:53 13 - 2016-08-21 16:08:42 55 - 2016-08-21 16:08:54 14 - 2016-08-21 16:08:43 56 - 2016-08-21 16:08:55 59 - 2016-08-21 16:08:58 58 - 2016-08-21 16:08:57 57 - 2016-08-21 16:08:56 19 - 2016-08-21 16:08:48 18 - 2016-08-21 16:08:47 17 - 2016-08-21 16:08:46 16 - 2016-08-21 16:08:45 15 - 2016-08-21 16:08:44 51 - 2016-08-21 16:08:50 50 - 2016-08-21 16:08:49 12 - 2016-08-21 16:08:41 11 - 2016-08-21 16:08:40 10 - 2016-08-21 16:08:39 52 - 2016-08-21 16:08:51 53 - 2016-08-21 16:08:52 AddItem2执行完成
*/

 

 

 

using System;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Diagnostics;
using System.Collections;

namespace Test
{
    class Program
    {
        private static Hashtable _hashtable = new Hashtable();
        public static void AddItem1()
        {
            lock (_hashtable.SyncRoot)
            {
                Console.WriteLine("AddItem1()开始添加...    " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));

                for (int i = 10; i < 20; i++)
                {
                    _hashtable.Add(i, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));

                    Thread.Sleep(TimeSpan.FromMilliseconds(1000));
                }

                Console.WriteLine("AddItem1()结束添加...    " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
            }

            Console.WriteLine("AddItem1()退出方法体...  " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\n");
        }
        public static void AddItem11()
        {
            lock (_hashtable.SyncRoot)
            {
                Console.WriteLine("AddItem11()开始添加...   " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));

                for (int i = 50; i < 60; i++)
                {
                    _hashtable.Add(i, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));

                    Thread.Sleep(TimeSpan.FromMilliseconds(1000));
                }

                Console.WriteLine("AddItem11()结束添加...   " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
            }

            Console.WriteLine("AddItem11()退出方法体... " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\n");
        }



        private static Hashtable ht = Hashtable.Synchronized(new Hashtable());
        public static void AddItem2()
        {
            lock (ht)
            {
                Console.WriteLine("AddItem2()开始添加...    " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));

                for (int i = 10; i < 20; i++)
                {
                    ht.Add(i, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));

                    Thread.Sleep(TimeSpan.FromMilliseconds(1000));
                }

                Console.WriteLine("AddItem2()结束添加...    " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
            }

            Console.WriteLine("AddItem2()退出方法体...  " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\n");
        }
        public static void AddItem22()
        {
            lock (ht)
            {
                Console.WriteLine("AddItem22()开始添加...   " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));

                for (int i = 50; i < 60; i++)
                {
                    ht.Add(i, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));

                    Thread.Sleep(TimeSpan.FromMilliseconds(1000));
                }

                Console.WriteLine("AddItem22()结束添加...   " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
            }

            Console.WriteLine("AddItem22()退出方法体... " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\n");
        }


        static void Main()
        {
            var task1 = Task.Factory.StartNew(() =>
            {
                AddItem1();
            });

            var task2 = Task.Factory.StartNew(() =>
            {
                AddItem11();
            });

            Task.WaitAll(task1, task2);


            Console.WriteLine("Hashtable _hashtable = new Hashtable();");
            Console.WriteLine(_hashtable.Count.ToString());
            foreach (DictionaryEntry item in _hashtable)
            {
                Console.WriteLine("{0} - {1}", item.Key, item.Value);
            }

            Console.WriteLine("AddItem1执行完成");
            //Console.ReadLine();


            Task task3 = Task.Factory.StartNew(() =>
            {
                AddItem2();
            });
            task3.Wait();

            Console.WriteLine("t3:" + ht.Count.ToString() + "\n");
            foreach (DictionaryEntry item in ht)
            {
                Console.WriteLine("{0} - {1}", item.Key, item.Value);
            }

            Task task4 = Task.Factory.StartNew(() =>
            {
                AddItem22();
            });
            task4.Wait();


            Console.WriteLine("\n");

            Console.WriteLine("Hashtable ht = Hashtable.Synchronized(new Hashtable());");
            Console.WriteLine("ht:" + ht.Count.ToString());
            foreach (DictionaryEntry item in ht)
            {
                Console.WriteLine("{0} - {1}", item.Key, item.Value);
            }

            Console.WriteLine("AddItem2执行完成");
            Console.ReadLine();
        }
    }
}

 

TPL方式运行结果:

/*
AddItem1()开始添加...    2016-08-21 16:28:56
AddItem1()结束添加...    2016-08-21 16:29:06
AddItem1()退出方法体...  2016-08-21 16:29:06

AddItem11()开始添加...   2016-08-21 16:29:06
AddItem11()结束添加...   2016-08-21 16:29:16
AddItem11()退出方法体... 2016-08-21 16:29:16

Hashtable _hashtable = new Hashtable();
20
54 - 2016-08-21 16:29:10
13 - 2016-08-21 16:28:59
55 - 2016-08-21 16:29:11
14 - 2016-08-21 16:29:00
56 - 2016-08-21 16:29:12
59 - 2016-08-21 16:29:15
58 - 2016-08-21 16:29:14
57 - 2016-08-21 16:29:13
19 - 2016-08-21 16:29:05
18 - 2016-08-21 16:29:04
17 - 2016-08-21 16:29:03
16 - 2016-08-21 16:29:02
15 - 2016-08-21 16:29:01
51 - 2016-08-21 16:29:07
50 - 2016-08-21 16:29:06
12 - 2016-08-21 16:28:58
11 - 2016-08-21 16:28:57
10 - 2016-08-21 16:28:56
52 - 2016-08-21 16:29:08
53 - 2016-08-21 16:29:09
AddItem1执行完成
AddItem2()开始添加... 2016-08-21 16:29:16 AddItem2()结束添加... 2016-08-21 16:29:26 AddItem2()退出方法体... 2016-08-21 16:29:26 t3:10 16 - 2016-08-21 16:29:22 15 - 2016-08-21 16:29:21 14 - 2016-08-21 16:29:20 13 - 2016-08-21 16:29:19 12 - 2016-08-21 16:29:18 11 - 2016-08-21 16:29:17 10 - 2016-08-21 16:29:16 19 - 2016-08-21 16:29:25 18 - 2016-08-21 16:29:24 17 - 2016-08-21 16:29:23 AddItem22()开始添加... 2016-08-21 16:29:26 AddItem22()结束添加... 2016-08-21 16:29:36 AddItem22()退出方法体... 2016-08-21 16:29:37 Hashtable ht = Hashtable.Synchronized(new Hashtable()); ht:20 54 - 2016-08-21 16:29:30 13 - 2016-08-21 16:29:19 55 - 2016-08-21 16:29:31 14 - 2016-08-21 16:29:20 56 - 2016-08-21 16:29:32 59 - 2016-08-21 16:29:35 58 - 2016-08-21 16:29:34 57 - 2016-08-21 16:29:33 19 - 2016-08-21 16:29:25 18 - 2016-08-21 16:29:24 17 - 2016-08-21 16:29:23 16 - 2016-08-21 16:29:22 15 - 2016-08-21 16:29:21 51 - 2016-08-21 16:29:27 50 - 2016-08-21 16:29:26 12 - 2016-08-21 16:29:18 11 - 2016-08-21 16:29:17 10 - 2016-08-21 16:29:16 52 - 2016-08-21 16:29:28 53 - 2016-08-21 16:29:29 AddItem2执行完成
*/

 

posted @ 2016-08-17 23:05  茗::流  阅读(131)  评论(0)    收藏  举报
如有雷同,纯属参考。如有侵犯你的版权,请联系我。