在C#中,lock
關鍵字(在.NET框架中等同于Monitor.Enter
和Monitor.Exit
)用于實現線程同步
當一個線程進入lock
塊時,它會獲取互斥鎖。如果另一個線程已經持有該鎖,則該線程將被阻塞,直到鎖被釋放。當線程退出lock
塊時,它會釋放鎖。
C#的lock
關鍵字確保了內存可見性,因為它會導致編譯器和處理器在鎖定和解鎖操作之前和之后生成內存屏障。內存屏障是一種同步原語,用于確保內存操作的順序。具體來說,它們可以防止編譯器和處理器對內存操作進行重新排序。
這意味著,當一個線程進入lock
塊時,它將看到在該鎖保護的共享變量上進行的所有更改。當線程退出lock
塊時,它對共享變量所做的所有更改都將對其他線程可見。
下面是一個簡單的C#示例,展示了如何使用lock
關鍵字確保內存可見性:
class Counter
{
private int _count;
private readonly object _lock = new object();
public void Increment()
{
lock (_lock)
{
_count++;
}
}
public int GetCount()
{
lock (_lock)
{
return _count;
}
}
}
在這個示例中,我們使用lock
關鍵字確保_count
變量的內存可見性。當一個線程調用Increment
方法時,它會獲取鎖并遞增_count
。當另一個線程調用GetCount
方法時,它也會獲取相同的鎖并讀取_count
的值。由于lock
關鍵字確保了內存可見性,因此每個線程都能看到最新的_count
值。