C#中如何實(shí)現(xiàn)線(xiàn)程同步

c#
小樊
83
2024-08-27 10:10:38

在C#中,可以使用多種方法來(lái)實(shí)現(xiàn)線(xiàn)程同步

  1. 使用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)
        {
            // 同步代碼
        }
    }
}
  1. 使用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);
        }
    }
}
  1. 使用SemaphoreSemaphoreSlim類(lèi):

SemaphoreSemaphoreSlim類(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();
        }
    }
}
  1. 使用并發(fā)集合:

C#提供了一些線(xiàn)程安全的集合,如ConcurrentDictionaryConcurrentQueue等。這些集合在內(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)景。

0