(一).描述 此示例演示分别用lock以及Interlocked和Monitor类实现线程的临界区操作(互斥)(二).代码 using System;using System.Threading;using System.Collections; namespace 加锁_实现临界区互斥操作_{ //委托声明(函数签名) delegate string MyMethodDelegate(); class MyClass { private static ArrayList arrList = new ArrayList(); private static int i = 0; public static void Add() { //方法一:用 lock 实现// lock(arrList)// {// arrList.Add(i.ToString());// i++;// } //方法二: 用Interlicked类实现// System.Threading.Interlocked.Increment(ref i);// arrList.Add(i.ToString()); //方法三: 用Monitor类实现 try { //I.不限时间 //stem.Threading.Monitor.Enter(arrList); //II.在指定时间获得排他锁 if(System.Threading.Monitor.TryEnter(arrList,TimeSpan.FromSeconds(30))) //在30秒内获取对象排他锁. 灵活运用可以实现防止死锁功能 { //避免互相等待情况。 在一定时间内得不到排他锁,可能是自己 //占用其它排它锁造成的(别的正在等自己正占用的排它锁,而处于等待状态), //这时可以释放掉自己正占用的排他锁后,再试图去得到想要的对象的排他锁 arrList.Add(i.ToString()); i++; } } catch { //发生异常后自定义错误处理代码 } finally { Monitor.Exit(arrList); //不管是正常还是发生错误,都得释放对象 } } [STAThread] static void Main(string[] args) { Thread thread1 = new Thread(new ThreadStart(Add)); Thread thread2 = new Thread(new ThreadStart(Add)); Thread thread3 = new Thread(new ThreadStart(Add)); thread1.Start(); thread2.Start(); thread3.Start(); Console.Read(); for(int i=0;i<arrList.Count;i++) { Console.WriteLine(arrList[i].ToString()); } Console.Read(); } }} 本示例代码已经测试,能够正常运行! (三).示例下载 http://www.cnblogs.com/Files/ChengKing/ThreadExample.rar

评论