在C#中,可以使用多種方法來實現線程同步
lock
關鍵字:lock
關鍵字可以確保一次只有一個線程訪問代碼塊。當一個線程已經獲得了鎖時,其他線程必須等待直到鎖被釋放。
class Program
{
private static readonly object _lockObject = new object();
static void Main(string[] args)
{
Task task1 = Task.Run(() => Work());
Task task2 = Task.Run(() => Work());
Task.WaitAll(task1, task2);
}
static void Work()
{
lock (_lockObject)
{
// 同步代碼
}
}
}
Monitor
類:Monitor
類提供了一種顯式的方式來實現線程同步。與lock
關鍵字類似,Monitor
類也使用對象作為鎖。
class Program
{
private static readonly object _lockObject = new object();
static void Main(string[] args)
{
Task task1 = Task.Run(() => Work());
Task task2 = Task.Run(() => Work());
Task.WaitAll(task1, task2);
}
static void Work()
{
Monitor.Enter(_lockObject);
try
{
// 同步代碼
}
finally
{
Monitor.Exit(_lockObject);
}
}
}
Semaphore
或SemaphoreSlim
類:Semaphore
和SemaphoreSlim
類可以限制同時訪問特定代碼段的線程數量。這對于限制資源訪問(如數據庫連接)非常有用。
class Program
{
private static readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1, 1);
static void Main(string[] args)
{
Task task1 = Task.Run(() => Work());
Task task2 = Task.Run(() => Work());
Task.WaitAll(task1, task2);
}
static async void Work()
{
await _semaphore.WaitAsync();
try
{
// 同步代碼
}
finally
{
_semaphore.Release();
}
}
}
C#提供了一些線程安全的集合,如ConcurrentDictionary
、ConcurrentQueue
等。這些集合在內部實現了線程同步,因此可以在多線程環境中安全地使用。
class Program
{
private static readonly ConcurrentDictionary<int, int> _concurrentDictionary = new ConcurrentDictionary<int, int>();
static void Main(string[] args)
{
Task task1 = Task.Run(() => Work());
Task task2 = Task.Run(() => Work());
Task.WaitAll(task1, task2);
}
static void Work()
{
// 使用線程安全的并發集合
_concurrentDictionary.TryAdd(1, 1);
}
}
這些方法可以幫助你在C#中實現線程同步。選擇哪種方法取決于你的需求和場景。