C#執行緒同步


同步是一種只允許一個執行緒在特定時間存取某些資源的技術。沒有其他執行緒可以中斷,直到所分配的執行緒或當前存取執行緒存取資料完成其任務。

在多執行緒程式中,允許執行緒存取任何資源所需的執行時間。執行緒共用資源並非同步執行。 存取共用資源(資料)是有時可能會暫停系統的關鍵任務。所以可以通過執行緒同步來處理它。

主要場景如:存款,取款等交易業務處理。

執行緒同步的優點

  • 一致性維護
  • 無執行緒干擾

C#鎖定

使用 C# lock關鍵字同步執行程式。它用於為當前執行緒鎖定,執行任務,然後釋放鎖定。它確保其他執行緒在執行完成之前不會中斷執行。

下面,建立兩個非同步和同步的例子。

C# 範例:非同步

在這個例子中,我們不使用鎖。此範例非同步執行。換句話說,執行緒之間存在上下文切換。

using System;
using System.Threading;
class Printer
{
    public void PrintTable()
    {
        for (int i = 1; i <= 5; i++)
        {
            Thread t = Thread.CurrentThread;
            Thread.Sleep(200);
            Console.WriteLine(t.Name+" "+i);
        }
    }
}
class Program
{
    public static void Main(string[] args)
    {
        Printer p = new Printer();
        Thread t1 = new Thread(new ThreadStart(p.PrintTable));
        Thread t2 = new Thread(new ThreadStart(p.PrintTable));
        t1.Name = "Thread 1 :";
        t2.Name = "Thread 2 :";
        t1.Start();
        t2.Start();
    }
}

執行上面範例程式碼,可以看到以下輸出結果 -

Thread 2 : 1
Thread 1 : 1
Thread 2 : 2
Thread 1 : 2
Thread 2 : 3
Thread 1 : 3
Thread 2 : 4
Thread 1 : 4
Thread 2 : 5
Thread 1 : 5

C# 執行緒同步範例

在這個例子中,我們使用lock塊,因此範例同步執行。 換句話說,執行緒之間沒有上下文切換。在輸出部分,可以看到第二個執行緒在第一個執行緒完成任務之後開始執行。

using System;
using System.Threading;
class Printer
{
    public void PrintTable()
    {
        lock (this)
        {
            for (int i = 1; i <= 5; i++)
            {
                Thread t = Thread.CurrentThread;
                Thread.Sleep(100);
                Console.WriteLine(t.Name + " " + i);
            }
        }
    }
}
class Program
{
    public static void Main(string[] args)
    {
        Printer p = new Printer();
        Thread t1 = new Thread(new ThreadStart(p.PrintTable));
        Thread t2 = new Thread(new ThreadStart(p.PrintTable));
        t1.Name = "Thread 1 :";
        t2.Name = "Thread 2 :";
        t1.Start();
        t2.Start();
    }
}

執行上面範例程式碼,可以看到以下輸出結果 -

Thread 1 : 1
Thread 1 : 2
Thread 1 : 3
Thread 1 : 4
Thread 1 : 5
Thread 2 : 1
Thread 2 : 2
Thread 2 : 3
Thread 2 : 4
Thread 2 : 5