1 互斥鎖lock(基於Monitor實現)
定義:
private static readonly object Lock = new object();
使用:
lock (Lock)
{
//todo
}
作用:將會鎖住代碼塊的內容,並阻止其他線程進入該代碼塊,直到該代碼塊運行完成,釋放該鎖。
注意:定義的鎖對象應該是 私有的,靜態的,只讀的,引用類型的對象,這樣可以防止外部改變鎖對象
2 互斥鎖Monitor
定義:
private static readonly object Lock = new object();
使用:
Monitor.Enter(Lock);
//todo
Monitor.Exit(Lock);
作用:將會鎖住代碼塊的內容,並阻止其他線程進入該代碼塊,直到該代碼塊運行完成,釋放該鎖。
注意:定義的鎖對象應該是 私有的,靜態的,只讀的,引用類型的對象,這樣可以防止外部改變鎖對象
Monitor有TryEnter的功能,可以防止出現死鎖的問題,lock沒有
3 互斥鎖Mutex
定義:
private static readonly Mutex mutex = new Mutex();
使用:
mutex.WaitOne();
//todo
mutex.ReleaseMutex();
作用:將會鎖住代碼塊的內容,並阻止其他線程進入該代碼塊,直到該代碼塊運行完成,釋放該鎖。
注意:定義的鎖對象應該是 私有的,靜態的,只讀的,引用類型的對象,這樣可以防止外部改變鎖對象
Mutex本身是可以系統級別的,所以是可以跨越進程的
4 讀寫鎖ReaderWriterLockSlim
定義:
private static readonly ReaderWriterLockSlim LockSlim = new ReaderWriterLockSlim();
使用:
寫鎖
try
{
LockSlim.EnterWriteLock();
//todo
}
catch (Exception ex)
{
}
finally
{
LockSlim.ExitWriteLock();
}
讀鎖
try
{
LockSlim.EnterReadLock();
}
catch (Exception ex)
{
}
finally
{
LockSlim.ExitReadLock();
}
基本規則: 讀讀不互斥 讀寫互斥 寫寫互斥
作用:當同一個資源被多個線程讀,少個線程寫的時候,使用讀寫鎖
引用:https://blog.csdn.net/weixin_40839342/article/details/81189596
問題: 既然讀讀不互斥,為何還要加讀鎖
答: 如果只是讀,是不需要加鎖的,加鎖本身就有性能上的損耗
如果讀可以不是最新數據,也不需要加鎖
如果讀必須是最新數據,必須加讀寫鎖
讀寫鎖相較於互斥鎖的優點僅僅是允許讀讀的並發,除此之外並無其他。
注意:不要使用ReaderWriterLock,該類有問題