锁定性能锁定多个列表

本文关键字:锁定 列表 性能 | 更新日期: 2023-09-27 17:56:48

我应该使用 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);
        }
    }
}

参考这一点,锁定列表 1 和列表 2 是正确的吗?

在多线程方案中正确锁定列表

锁定性能锁定多个列表

我应该使用 2 个锁定变量还是 1 个就足够了,它会影响性能吗?

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

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

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

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

或者换句话说 - 如果 4 个锁对于您的应用程序来说太慢了 - 您需要完全改变方法并寻找无锁算法,这很重要。

我会说一百把锁似乎很可疑,但 3-4 我什至不会浪费时间去问它。