16

给定以下课程:

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()可以从不同的线程同时调用并注意这一点listOne并且listTwo无论如何都不相关。锁定中涉及的唯一操作是上面注释中指定的操作。

4

2 回答 2

10

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

于 2013-02-11T14:15:58.917 回答
9

这里不需要单独的锁对象。以下代码也可以正常工作,代码更少,开销更少,错误使用错误锁的机会更少:

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
        }
    }
}
于 2013-02-11T14:43:18.560 回答