c# 鎖的使用


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,該類有問題

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM