Monitor:
定義:Monitor 是 C# 中最基本的同步機制,通過 Enter 和 Exit 方法來控制對共享資源的訪問。它提供了排他鎖的功能,確保在任何時刻只有一個線程可以訪問共享資源。
優(yōu)點:簡單易用,適合對臨界區(qū)進行粗粒度的同步控制。
缺點:只能實現(xiàn)排它鎖,不能實現(xiàn)讀寫鎖,性能相對較低。
class Program
{
static readonly object _lock = new object();
static int _counter = 0;
static void Main()
{
for (int i = 0; i < 10; i++)
{
new Thread(IncrementCounter).Start();
}
Console.ReadKey();
}
static void IncrementCounter()
{
Monitor.Enter(_lock);
try
{
_counter++;
Console.WriteLine($"Counter: {_counter}");
}
finally
{
Monitor.Exit(_lock);
}
}
}
Mutex:
定義:Mutex 是一個操作系統(tǒng)對象,用于在進程間共享,通過 WaitOne 和 ReleaseMutex 來控制對共享資源的訪問。它提供了進程間的同步能力。
優(yōu)點:可跨進程使用,適合在進程間進行同步。
缺點:相比 Monitor,性能開銷較大,因為涉及到系統(tǒng)調(diào)用。
class Program
{
static Mutex _mutex = new Mutex();
static int _counter = 0;
static void Main()
{
for (int i = 0; i < 10; i++)
{
new Thread(IncrementCounter).Start();
}
Console.ReadKey();
}
static void IncrementCounter()
{
_mutex.WaitOne();
_counter++;
Console.WriteLine($"Counter: {_counter}");
_mutex.ReleaseMutex();
}
}
ReaderWriterLockSlim:
定義:ReaderWriterLockSlim 實現(xiàn)了讀寫分離鎖,允許多個線程同時讀取共享資源,但只允許一個線程寫入共享資源。這種機制適用于讀多寫少的場景。
優(yōu)點:適合讀多寫少的場景,提高了并發(fā)性能。
缺點:相對復(fù)雜,可能會引起死鎖,不支持遞歸鎖。
class Program
{
static ReaderWriterLockSlim _rwLock = new ReaderWriterLockSlim();
static int _counter = 0;
static void Main()
{
for (int i = 0; i < 5; i++)
{
new Thread(ReadCounter).Start();
new Thread(IncrementCounter).Start();
}
Console.ReadKey();
}
static void ReadCounter()
{
_rwLock.EnterReadLock();
Console.WriteLine($"Counter: {_counter}");
_rwLock.ExitReadLock();
}
static void IncrementCounter()
{
_rwLock.EnterWriteLock();
_counter++;
Console.WriteLine($"Counter incremented to: {_counter}");
_rwLock.ExitWriteLock();
}
}
Semaphore:
定義:Semaphore 是一個信號量,用于控制同時訪問共享資源的線程數(shù)量。通過 WaitOne 和 Release 方法,可以控制訪問資源的線程數(shù)量。
優(yōu)點:可以控制多個線程同時訪問共享資源的數(shù)量,靈活性較高。
缺點:相對于其他機制,使用起來較為復(fù)雜,需要謹慎處理信號量的釋放。
class Program
{
static Semaphore _semaphore = new Semaphore(2, 2); // Allow 2 threads to access the resource simultaneously
static int _counter = 0;
static void Main()
{
for (int i = 0; i < 5; i++)
{
new Thread(IncrementCounter).Start();
}
Console.ReadKey();
}
static void IncrementCounter()
{
_semaphore.WaitOne();
_counter++;
Console.WriteLine($"Counter: {_counter}");
_semaphore.Release();
}
}
SemaphoreSlim:
定義:SemaphoreSlim 是輕量級的信號量,與 Semaphore 類似,用于控制同時訪問共享資源的線程數(shù)量,但相比 Semaphore 更輕量級。
優(yōu)點:相比 Semaphore,SemaphoreSlim 的開銷更小,適用于資源訪問頻繁的場景。
缺點:與 Semaphore 相比,功能上略有限制,例如沒有 Release(Int32) 方法,只能遞增信號量一個單位。
class Program
{
static SemaphoreSlim _semaphore = new SemaphoreSlim(2, 2); // Allow 2 threads to access the resource simultaneously
static int _counter = 0;
static void Main()
{
for (int i = 0; i < 5; i++)
{
new Thread(IncrementCounter).Start();
}
Console.ReadKey();
}
static void IncrementCounter()
{
_semaphore.Wait();
_counter++;
Console.WriteLine($"Counter: {_counter}");
_semaphore.Release();
}
}
lock:
定義:lock 是 C# 中的關(guān)鍵字,用于在代碼塊級別實現(xiàn)互斥鎖,保護共享資源不被多個線程同時訪問。
優(yōu)點:簡單易用,適合對臨界區(qū)進行細粒度的同步控制,編寫起來比較方便。
缺點:只能用于單線程內(nèi)部的同步,不能跨越線程或進程,如果不小心使用會導致死鎖。
class Program
{
static readonly object _lock = new object();
static int _counter = 0;
static void Main()
{
for (int i = 0; i < 5; i++)
{
new Thread(IncrementCounter).Start();
}
Console.ReadKey();
}
static void IncrementCounter()
{
lock (_lock)
{
_counter++;
Console.WriteLine($"Counter: {_counter}");
}
}
}
轉(zhuǎn)自https://www.cnblogs.com/INetIMVC/p/18330485
該文章在 2024/7/30 11:10:12 編輯過