(一).描述
此示例演示分別用lock以及Interlocked和Monitor類(lèi)實(shí)現(xiàn)線程的臨界區(qū)操作(互斥)
(二).代碼
using System;
using System.Threading;
using System.Collections;
namespace 加鎖_實(shí)現(xiàn)臨界區(qū)互斥操作_
{
//委托聲明(函數(shù)簽名)
delegate string MyMethodDelegate();
class MyClass
{
private static ArrayList arrList = new ArrayList();
private static int i = 0;
public static void Add()
{
//方法一:用 lock 實(shí)現(xiàn)
// lock(arrList)
// {
// arrList.Add(i.ToString());
// i++;
// }
//方法二: 用Interlicked類(lèi)實(shí)現(xiàn)
// System.Threading.Interlocked.Increment(ref i);
// arrList.Add(i.ToString());
//方法三: 用Monitor類(lèi)實(shí)現(xiàn)
try
{
//I.不限時(shí)間
//stem.Threading.Monitor.Enter(arrList);
//II.在指定時(shí)間獲得排他鎖
if(System.Threading.Monitor.TryEnter(arrList,TimeSpan.FromSeconds(30))) //在30秒內(nèi)獲取對(duì)象排他鎖. 靈活運(yùn)用可以實(shí)現(xiàn)防止死鎖功能
{ //避免互相等待情況。 在一定時(shí)間內(nèi)得不到排他鎖,,可能是自己
//占用其它排它鎖造成的(別的正在等自己正占用的排它鎖,,而處于等待狀態(tài)),
//這時(shí)可以釋放掉自己正占用的排他鎖后,,再試圖去得到想要的對(duì)象的排他鎖
arrList.Add(i.ToString());
i++;
}
}
catch
{
//發(fā)生異常后自定義錯(cuò)誤處理代碼
}
finally
{
Monitor.Exit(arrList); //不管是正常還是發(fā)生錯(cuò)誤,,都得釋放對(duì)象
}
}
[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();
}
}
}
本示例代碼已經(jīng)測(cè)試,能夠正常運(yùn)行!
(三).示例下載
http://www.cnblogs.com/Files/ChengKing/ThreadExample.rar