(一)锁的概念
(二)lock关键词在C#语言中的用法
代码class Program { private static readonly object _syncRoot = new Object(); static Thread t1 = new Thread(new ParameterizedThreadStart(P)); static Thread t2 = new Thread(new ParameterizedThreadStart(P)); static Thread t3 = new Thread(new ParameterizedThreadStart(P)); static void Main(string[] args) { t1.Name = "A"; t2.Name = "B"; t3.Name = "C"; t1.Start(t1); t2.Start(t2); t3.Start(t3); //t1.Join(); //t2.Join(); //t3.Join(); //Console.WriteLine("------------"); //Console.ReadKey(); } static void P(object name) { Thread t = name as Thread; Console.WriteLine("线程名:{0}-1 占用资源\t时间:{5:HH:mm:ss.fff} 当前线程:{1,-18} A:{2,-18} B:{3,-18} C:{4}", t.Name, t.ThreadState.ToString() + " ID:" + t.ManagedThreadId, t1.ThreadState.ToString() + " ID:" + t1.ManagedThreadId, t2.ThreadState.ToString() + " ID:" + t2.ManagedThreadId, t3.ThreadState.ToString() + " ID:" + t3.ManagedThreadId, DateTime.Now); lock (_syncRoot) { Console.WriteLine("线程名:{0}-2 Sleep前\t时间:{5:HH:mm:ss.fff} 当前线程:{1,-18} A:{2,-18} B:{3,-18} C:{4}", t.Name, t.ThreadState.ToString() + " ID:" + t.ManagedThreadId, t1.ThreadState.ToString() + " ID:" + t1.ManagedThreadId, t2.ThreadState.ToString() + " ID:" + t2.ManagedThreadId, t3.ThreadState.ToString() + " ID:" + t3.ManagedThreadId, DateTime.Now); Thread.Sleep(5000); Console.WriteLine("线程名:{0}-3 Sleep后\t时间:{5:HH:mm:ss.fff} 当前线程:{1,-18} A:{2,-18} B:{3,-18} C:{4}", t.Name, t.ThreadState.ToString() + " ID:" + t.ManagedThreadId, t1.ThreadState.ToString() + " ID:" + t1.ManagedThreadId, t2.ThreadState.ToString() + " ID:" + t2.ManagedThreadId, t3.ThreadState.ToString() + " ID:" + t3.ManagedThreadId, DateTime.Now); } Console.WriteLine("线程名:{0}-4 释放资源\t时间:{5:HH:mm:ss.fff} 当前线程:{1,-18} A:{2,-18} B:{3,-18} C:{4}", t.Name, t.ThreadState.ToString() + " ID:" + t.ManagedThreadId, t1.ThreadState.ToString() + " ID:" + t1.ManagedThreadId, t2.ThreadState.ToString() + " ID:" + t2.ManagedThreadId, t3.ThreadState.ToString() + " ID:" + t3.ManagedThreadId, DateTime.Now); } }
代码执行分析如下:下图列出了代码四次执行输出的结果。