在C#中,Wait
和Notify
通常用于線程同步,它們是Object
類中的兩個方法。Wait
方法會使當前線程等待,直到另一個線程調用同一對象的Notify
或NotifyAll
方法。這兩個方法通常在多線程環境中使用,以避免資源競爭和數據不一致。
以下是一個簡單的示例,說明如何使用Wait
和Notify
方法:
using System;
using System.Threading;
class Program
{
static object lockObject = new object();
static int sharedResource = 0;
static void Main(string[] args)
{
Thread t1 = new Thread(ThreadMethod1);
Thread t2 = new Thread(ThreadMethod2);
t1.Start();
t2.Start();
t1.Join();
t2.Join();
}
static void ThreadMethod1()
{
lock (lockObject)
{
Console.WriteLine("Thread 1: Waiting for resource...");
Monitor.Wait(lockObject);
Console.WriteLine("Thread 1: Resource acquired.");
sharedResource++;
Console.WriteLine($"Thread 1: Shared resource value: {sharedResource}");
Monitor.Notify();
}
}
static void ThreadMethod2()
{
lock (lockObject)
{
Console.WriteLine("Thread 2: Waiting for resource...");
Monitor.Wait(lockObject);
Console.WriteLine("Thread 2: Resource acquired.");
sharedResource--;
Console.WriteLine($"Thread 2: Shared resource value: {sharedResource}");
Monitor.Notify();
}
}
}
在這個示例中,我們有兩個線程ThreadMethod1
和ThreadMethod2
。它們都嘗試訪問共享資源sharedResource
。為了避免數據不一致,我們使用lockObject
對象來同步線程。當一個線程獲得鎖并訪問共享資源時,其他線程必須等待,直到鎖被釋放。
Monitor.Wait(lockObject)
方法使當前線程等待,直到另一個線程調用Monitor.Notify(lockObject)
或Monitor.NotifyAll(lockObject)
方法。在這個例子中,我們使用Monitor.Notify()
方法喚醒一個等待的線程。當一個線程被喚醒并重新獲得鎖時,它將能夠訪問共享資源。
注意:在實際應用中,通常建議使用Monitor.Wait()
和Monitor.NotifyAll()
而不是Thread.Wait()
和Thread.Notify()
,因為它們提供了更好的封裝和錯誤處理。