一,鎖定機制最簡單的做法就是使用鎖定關鍵字Lock。Lock關鍵字英文中就是鎖的意思,顧名思義就是為操作加上一把鎖。它的語法如下:
lock(lockObj) |
二、同步方法(synchronized)
案例代碼:
using System; using System.Runtime.CompilerServices; namespace App4Thread { class Program { private static int count = 0; private static object myMutex = new object(); [MethodImpl(MethodImplOptions.Synchronized)] public static void Main() { count++; } } }
[MethodImpl(MethodImplOptions.Synchronized)],該屬性在方法調用期間鎖定,阻止其他調用者調用。
命名空間:System.Runtime.CompilerServices
程序集:mscorlib(mscorlib.dll 中)
功能:System.Runtime.CompilerServices命名空間為編譯器編寫器提供使用托管代碼在元數據中指定屬性。
三c#中Monitor的使用
首先lock和Minitor有什么區別呢?
其實
lock在IL代碼中會被翻譯成Monitor。也就是Monitor.Enter(obj)和Monitor.Exit(obj).
lock(obj)
{
}
等價為:
try
{
Monitor.Enter(obj)
}
catch()
{}
finally
{
Monitor.Exit(obj)
}
所以lock能做的,Monitor肯定能做,Monitor能做的,lock不一定能做。那么Monitor額外的功能呢?
1:Monitor.TryEnter(obj,timespan)----timeout之后,就不執行這段代碼了。lock可是一直會死等的。
2:還有Monitor.Wait()和Monitor.Pulse()。在lock代碼里面如果調用了Monitor.Wait(),會放棄對資源的所有權