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执行完成 */

浙公网安备 33010602011771号