鍍金池/ 教程/ C#/ C#線程同步
C#屬性(Properties)
C#與Java比較
C#方法
C#枚舉
C#關(guān)鍵字
C# StreamReader類
C#不安全代碼
C#文件(I/O)
C#匿名方法
C#線程同步
C# Thread類
C#主線程
C#數(shù)據(jù)類型
C# FileStream類
C#預(yù)處理指令
C#繼承
C#循環(huán)
C#決策結(jié)構(gòu)
C#集合
C#反射
C#類型轉(zhuǎn)換
C#泛型
C# StringReader類
C#歷史
C#運(yùn)算符重載
C#屬性
C#線程實(shí)例:Sleep()方法
C#線程示例:優(yōu)先級
C#線程實(shí)例:Join()方法
C# BinaryReader類
C#類
C#索引器
C# BinaryWriter類
C#序列化
C#常量和文字
C#程序結(jié)構(gòu)
C#封裝
C#事件
C#可空類型(nullable)
C#基本語法
C#異常處理
C#教程
C#接口
C# System.IO命名空間
C#線程命名實(shí)例
C# StringWriter類
C#線程實(shí)例
C#數(shù)組
C#正則表達(dá)式
C#命名空間
C#反序列化
C#與C++比較
C# TextWriter類
C#多線程
C#字符串
C#是什么?
C#變量
C# FileInfo類
C#線程實(shí)例:Abort()方法
C#結(jié)構(gòu)體
C#運(yùn)算符
C#入門程序
C#多線程生命周期
C# TextReader類
C# DirectoryInfo類
C#委托

C#線程同步

同步是一種只允許一個線程在特定時間訪問某些資源的技術(shù)。沒有其他線程可以中斷,直到所分配的線程或當(dāng)前訪問線程訪問數(shù)據(jù)完成其任務(wù)。

在多線程程序中,允許線程訪問任何資源所需的執(zhí)行時間。線程共享資源并異步執(zhí)行。 訪問共享資源(數(shù)據(jù))是有時可能會暫停系統(tǒng)的關(guān)鍵任務(wù)。所以可以通過線程同步來處理它。

主要場景如:存款,取款等交易業(yè)務(wù)處理。

線程同步的優(yōu)點(diǎn)

  • 一致性維護(hù)
  • 無線程干擾

C#鎖定

使用 C# lock關(guān)鍵字同步執(zhí)行程序。它用于為當(dāng)前線程鎖定,執(zhí)行任務(wù),然后釋放鎖定。它確保其他線程在執(zhí)行完成之前不會中斷執(zhí)行。

下面,創(chuàng)建兩個非同步和同步的例子。

C# 示例:非同步

在這個例子中,我們不使用鎖。此示例異步執(zhí)行。換句話說,線程之間存在上下文切換。

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();
    }
}

執(zhí)行上面示例代碼,可以看到以下輸出結(jié)果 -

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塊,因此示例同步執(zhí)行。 換句話說,線程之間沒有上下文切換。在輸出部分,可以看到第二個線程在第一個線程完成任務(wù)之后開始執(zhí)行。

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();
    }
}

執(zhí)行上面示例代碼,可以看到以下輸出結(jié)果 -

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