需要多个锁定对象?

时间:2013-02-11 14:13:35

标签: c# multithreading concurrency 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
        }
    }
}

使用两个锁定对象是否正确,假设可以同时从不同的线程调用MethodOne()MethodTwo(),并指出listOnelistTwo无关。锁中涉及的唯一操作是上面注释中指定的操作。

2 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分: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
        }
    }
}
相关问题