c#中的方法锁定

Ema*_*oni 13 .net c# multithreading thread-safety

我有一个类有这三种方法.许多线程都使用此类.如果Method2和/或Method3在任何线程中运行,我希望Method1等待.有什么建议?

public class Class1
{
    public static void Method1() 
    {
        Object lockThis = new Object();

        lock (lockThis)
        {
            //Body function
        }
    }

    public static void Method2() 
    {
         //Body function
    }

    public static void Method3() 
    {
         //Body function
    }
}
Run Code Online (Sandbox Code Playgroud)

Pao*_*sco 16

如果我理解正确,你需要这样的东西:

static object lockMethod2 = new object();
static object lockMethod3 = new object();

public static void Method1() 
{
    lock (lockMethod2)
    lock (lockMethod3)
    {
        //Body function
    }
}

public static void Method2() 
{
    lock (lockMethod2)
    {
        //Body function
    }
}

public static void Method3() 
{
    lock (lockMethod3)
    {
        //Body function
    }
}
Run Code Online (Sandbox Code Playgroud)

这允许method3在method2运行时执行,反之亦然,而method1必须等待两者.当然,方法2和3在1运行时不会运行.


Dan*_*rth 12

锁的当前实现完全没用,因为每个线程都会锁定不同的对象.
锁定通常使用仅初始化一次的只读字段来完成.
像这样,您可以轻松锁定多种方法:

public class Class1
{
    private static readonly object _syncRoot = new object();

    public static void Method1() 
    {
        lock (_syncRoot)
        {
            //Body function
        }
    }

    public static void Method2() 
    {
        lock (_syncRoot)
        {
            //Body function
        }
    }

    public static void Method3() 
    {
        lock (_syncRoot)
        {
            //Body function
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Cor*_*Doe 12

我建议一个ReaderWriterLockSlim(http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim.aspx)

与读取操作类似,方法2和方法3可以并行发生,而Method1(如写操作)需要等待那些完成.这不是常规的读/写并发情况,但逻辑是类似的.

public class Class1
{
    private ReaderWriterLockSlim methodLock = new ReaderWriterLockSlim();
    public static void Method1() 
    {
        methodLock.EnterWriteLock();
        try
        {
            //Body function
        }
        finally
        {
            methodLock.ExitWriteLock();
        }
    }

    public static void Method2() 
    {
         methodLock.EnterReadLock();
        try
        {
            //Body function
        }
        finally
        {
            methodLock.ExitReadLock();
        }
    }

    public static void Method3() 
    {
         methodLock.EnterReadLock();
        try
        {
            //Body function
        }
        finally
        {
            methodLock.ExitReadLock();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)