Tux*_*Tux 4 c# multithreading synchronization locking
我有一个私有静态字段,我用它来进行同步(锁定).现在我有两个函数,我不想同时执行.所以我这样做了:
public class Synchronization
{
    private static object _lock = new object();
    public void MethodA()
    {
        lock (_lock)
        {
            Console.WriteLine("I shouldn't execute with MethodB");
        }
    }
    public void MethodB()
    {
        lock (_lock)
        {
            Console.WriteLine("I shouldn't execute with MethodA");
        }
    }
}
我知道锁定一个对象会阻止单个函数的并行执行,但如果我在同时运行的不同方法中使用相同的锁对象,那么同样的工作吗?简单地说,put可以任何其他线程获取锁定另一个函数中已经锁定的对象吗?
一次只有一个线程可以获取锁,因此该状态对于单个锁实例上的所有线程都是独占的.因此,在您的示例中,Synchronization由于您的锁是静态的,因此在任何给定时间只能为所有类实例执行一个方法体.如果要锁定每个类的实例,请不要将锁定对象标记为静态.
您对同步的假设是正确的.
请注意,您应该将锁定物体标记readonly为完全防水的解决方案.正如代码所代表的那样,可以重新分配锁定对象,从而打破锁定语义,例如:
public class Synchronization
{
    private static object _lock = new object();
    public void MethodA()
    {
        lock (_lock)
        {
            Console.WriteLine("I shouldn't execute with MethodB");
        }
    }
    public void MethodB()
    {
        //This shouldn't be allowed!
        _lock = new object();
        lock (_lock)
        {
            Console.WriteLine("I shouldn't execute with MethodA");
        }
    }
}
锁定对象应标记为readonly,即:
private static readonly object _lock = new object();