在C#中,可以使用多種方法來(lái)實(shí)現(xiàn)線(xiàn)程同步
lock
關(guān)鍵字:lock
關(guān)鍵字可以確保一次只有一個(gè)線(xiàn)程訪問(wèn)代碼塊。當(dāng)一個(gè)線(xiàn)程已經(jīng)獲得了鎖時(shí),其他線(xiàn)程必須等待直到鎖被釋放。
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
類(lèi):Monitor
類(lèi)提供了一種顯式的方式來(lái)實(shí)現(xiàn)線(xiàn)程同步。與lock
關(guān)鍵字類(lèi)似,Monitor
類(lèi)也使用對(duì)象作為鎖。
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
類(lèi):Semaphore
和SemaphoreSlim
類(lèi)可以限制同時(shí)訪問(wèn)特定代碼段的線(xiàn)程數(shù)量。這對(duì)于限制資源訪問(wèn)(如數(shù)據(jù)庫(kù)連接)非常有用。
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#提供了一些線(xiàn)程安全的集合,如ConcurrentDictionary
、ConcurrentQueue
等。這些集合在內(nèi)部實(shí)現(xiàn)了線(xiàn)程同步,因此可以在多線(xiàn)程環(huán)境中安全地使用。
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()
{
// 使用線(xiàn)程安全的并發(fā)集合
_concurrentDictionary.TryAdd(1, 1);
}
}
這些方法可以幫助你在C#中實(shí)現(xiàn)線(xiàn)程同步。選擇哪種方法取決于你的需求和場(chǎng)景。