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 个就足够了,它会影响性能吗?

如果您使用两个锁变量,则可以同时从不同的线程添加每个列表。

如果您使用单个锁变量,则两个线程将相互等待。这可能会导致更多的线程争用,从而降低整体吞吐量。

每个对象的单独锁定变量可能会以更高的复杂性为代价来提高性能。话虽如此,如果您在一个方法中同时使用两个列表,并且需要锁定这两个列表,则两个锁定变量会增加死锁的可能性,因此需要格外小心。

于 2013-01-30T20:55:56.393 回答
0

锁定非常快(如果我没记错的话,几纳秒)。3-4 把锁不是一个真正的问题。

或者换句话说 - 如果 4 个锁对于您的应用程序来说太慢了 - 您需要完全改变方法并寻找无锁算法而不是非平凡的。

我会说一百个锁看起来很可疑,但 3-4 我什至不会浪费时间去问这个问题。

于 2013-01-31T03:03:32.903 回答