在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
值。