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
        }
    }
}

とがとにかく関連していないことに注意して、異なるスレッドから同時に呼び出すことができると仮定して、2つのロックオブジェクトを使用するのは正しいですかMethodOne()?ロックに関連する操作は、上記のコメントで指定されている操作のみです。MethodTwo()listOnelistTwo

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 に答える