需要多个锁定对象?

Stu*_*ler 13 c# concurrency multithreading locking

鉴于以下课程:

class x
{
    Object lockOne = new Object();
    Object lockTwo = new Object();

    List<Something> listOne = new List<Something>();
    List<Something> listTwo = new List<Something>();

    void MethodOne()
    {
        lock(lockOne)
        {
            // some operation on listOne
        }
    }

    void MethodTwo()
    {
        lock(lockTwo)
        {
            // some operation on listTwo
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

使用两个锁定对象是正确的,假设MethodOne()并且MethodTwo()可以同时从不同的线程调用并注意到listOne并且listTwo无论如何都不相关.锁中涉及的唯一操作是上面注释中指定的操作.

Mat*_*son 8

是的,这是正确的.它避免了因为正在处理其他列表而不必要地锁定一个列表.

  • 为了澄清svick所说的内容,他并没有说要锁定单个锁定对象,而是[根本不使用任何锁定对象](http://stackoverflow.com/a/14814386/80274)并锁定列表本身. (5认同)
  • 正确?是.浪费了?同样是的,这里不需要单独的锁定对象. (2认同)

svi*_*ick 8

这里不需要单独的锁定对象.以下代码也可以正常工作,代码更少,开销更少,错误使用错误锁定的可能性更小:

class x
{
    List<Something> listOne = new List<Something>();
    List<Something> listTwo = new List<Something>();

    void MethodOne()
    {
        lock (listOne)
        {
            // some operation on listOne
        }
    }

    void MethodTwo()
    {
        lock (listTwo)
        {
            // some operation on listTwo
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 就像一个注释一样,最佳实践(如下所示)只是锁定对类"私有"的项目 - 否则你不知道外部代码在导致死锁或竞争条件时可能会尝试锁定它. (11认同)