1

2 つのロック変数を使用する必要がありますか、それとも 1 つで十分ですか? パフォーマンスに影響しますか? 複数のスレッドから呼び出すメソッドが 3 つまたは 4 つある場合はどうなりますか?

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

    private static List<string> _list1;
    private static List<string> _list2;

    public Foolocking()
    {
        _list1 = new List<string>();
        _list2 = new List<string>();
    }

    public void Method1(string s1)
    {
        lock (_syncRoot)
        {
            _list1.Add(s1);
        }
    }

    public void Method2(string s2)
    {
        lock (_syncRoot)
        {
            _list2.Add(s2);
        }
    }
}

これを参考に、list1とlist2自体をロックするのが正しいでしょうか?

マルチスレッドシナリオで List<T> を適切にロックしていますか?

4

2 に答える 2

1

2 つのロック変数を使用する必要がありますか、それとも 1 つで十分ですか? パフォーマンスに影響しますか?

2 つのロック変数を使用する場合、各リストは別々のスレッドから同時に追加できます。

単一のロック変数を使用すると、2 つのスレッドが相互に待機します。これにより、スレッドの競合が増える可能性があり、全体的なスループットが低下する可能性があります。

オブジェクトごとに個別のロック変数を使用すると、パフォーマンスが向上する可能性がありますが、複雑さが増します。そうは言っても、1 つのメソッド内で両方のリストを使用していて、両方をロックする必要がある場合、2 つのロック変数によってデッドロックが発生する可能性が高まるため、特別な注意が必要になります。

于 2013-01-30T20:55:56.393 に答える
0

ロックは非常に高速です (私の記憶が正しければ数ナノ秒)。3〜4回のロックは本当の問題ではありません。

つまり、4 つのロックがアプリにとって遅すぎる場合は、アプローチを完全に変更し、代わりに重要なロックフリー アルゴリズムを探す必要があります。

100 のロックは怪しいと思いますが、3 ~ 4 のロックについて尋ねるのに時間を無駄にすることはありません。

于 2013-01-31T03:03:32.903 に答える