C# 中的 lock 語句

Muhammad Maisam Abbas 2021年3月21日
C# 中的 lock 語句

在本教程中,我們將討論 C# 中的 lock 語句。

C# 中的 lock 語句

lock(obj) 語句規定,在 C# 中,下面這段程式碼不能被多個執行緒同時訪問。lock(obj) 語句中的 obj 引數是 object 類的例項。lock(obj) 語句提供了一種在 C# 中管理執行緒的有效方法。如果一個執行緒訪問 lock(obj) 內的程式碼,而另一個執行緒想要訪問相同的程式碼,則第二個執行緒將不得不等待第一個執行緒執行它。lock(obj) 語句可確保順序執行指定的程式碼段。為了演示這種現象,我們將首先使用 lock(obj) 語句向你顯示程式碼的結果,而不用任何執行緒管理。

using System;
using System.Threading;

namespace lock_statement
{
    class Program
    {
        static readonly object lockname = new object();
        static void display()
        {
                for (int a = 1; a <= 3; a++)
                {
                    Console.WriteLine("The value to be printed is: {0}", a);
                }
        }
        static void Main(string[] args)
        {
            Thread firstthread = new Thread(display);
            Thread secondthread = new Thread(display);
            firstthread.Start();
            secondthread.Start();
        }
    }
}

輸出:

The value to be printed is: 1
The value to be printed is: 1
The value to be printed is: 2
The value to be printed is: 3
The value to be printed is: 2
The value to be printed is: 3

我們可以看到,執行緒 firstthreadsecondthread 都隨機訪問迴圈內的程式碼。我們將通過 lock(obj) 語句向你顯示執行緒管理的程式碼結果。

using System;
using System.Threading;

namespace lock_statement
{
    class Program
    {
        static readonly object lockname = new object();
        static void display()
        {
            lock (lockname)
            {
                for (int a = 1; a <= 3; a++)
                {
                    Console.WriteLine("The value to be printed is: {0}", a);
                }
            }
        }
        static void Main(string[] args)
        {
            Thread firstthread = new Thread(display);
            Thread secondthread = new Thread(display);
            firstthread.Start();
            secondthread.Start();
        }
    }
}

輸出:

The value to be printed is: 1
The value to be printed is: 2
The value to be printed is: 3
The value to be printed is: 1
The value to be printed is: 2
The value to be printed is: 3

這次,firstthreadsecondthread 依次訪問迴圈內的程式碼。我們可以將用來更改變數值的程式碼放在 lock(obj) 語句中,以防止任何資料丟失。

Muhammad Maisam Abbas avatar Muhammad Maisam Abbas avatar

Maisam is a highly skilled and motivated Data Scientist. He has over 4 years of experience with Python programming language. He loves solving complex problems and sharing his results on the internet.

LinkedIn

相關文章 - Csharp Thread