首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 多執行緒資料共享:Static 與 Lock 同步機制實作

     編輯:關於C語言

共享資料模式

使用 static 修飾詞讓欄位屬於類別而非實例,所有執行緒存取同一份記憶體位置:

class MyThread {
    static Queue q1 = new Queue();
    static int b = 0;

    public void DoFun() {
        lock (this) {  // 同步區塊
            ++b;
            q1.Enqueue(b);
        }
        Console.WriteLine("B:{0}--------------", b);
        PrintValues(q1);
    }

    public static void PrintValues(IEnumerable myCollection) {
        IEnumerator myEnumerator = myCollection.GetEnumerator();
        while (myEnumerator.MoveNext()) Console.Write("\t{0}", myEnumerator.Current);
        Console.WriteLine();
    }
}

執行緒建立與啟動

class ClassMain {
    [STAThread]
    static void Main(string[] args) {
        MyThread myc = new MyThread();
        Thread[] myt = new Thread[10];
        for (int i = 0; i < 10; ++i) {
            myt[i] = new Thread(new ThreadStart(myc.DoFun));
            myt[i].Start();
            Thread.Sleep(1000); // 主執行緒休眠 1 秒
        }
        Console.Read(); // 等待按鍵防止視窗關閉
    }
}

關鍵點解析

概念說明
static 欄位跨實例共享,AppDomain 內單一拷貝
lock (this)互斥鎖,確保遞增與入隊操作原子性
ThreadStart 委派指向無參數無回傳值的方法
Thread.Sleep讓出 CPU 時間片,觀察交錯執行效果

進階建議

  • 實務上偏好 lock (privateObj) 而非 lock (this),避免外部程式碼取得同一個鎖物件造成死結
  • 考慮使用 ConcurrentQueue<T>、Interlocked.Increment 等無鎖集合與原子操作提升效能
  • 共享狀態越少越好,優先採用「不共享記憶體,透過訊息傳遞溝通」的設計模式
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved