【问题标题】:lock performance locking multiple Lists锁定性能锁定多个列表
【发布时间】:2013-01-30 20:53:00
【问题描述】:

我应该使用 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是否正确?

Properly locking a List<T> in MultiThreaded Scenarios?

【问题讨论】:

  • 如果使用.net 4,可以考虑Thread-Safe Collections
  • 我认为您的意思是在Method2 中向_list2 添加一个项目。否则它们只是做同样事情的两种方法。
  • @AdiLester c&p 错误,我已更正

标签: c# multithreading locking


【解决方案1】:

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

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

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

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

【讨论】:

  • “可以减少”是什么意思?如果我在 3 个列表上使用 3 种方法,使用 3 个锁变量会快 3 倍还是快 1 1/100 倍?没有方法会同时使用这两个列表。
  • @RobertP。这些方法必须相互等待,这意味着长时间运行的方法将在整个运行过程中阻塞较短的方法 - 基本上,您在任何时候都只会获得一个使用任何列表的线程。它可能是瓶颈,也可能不是 - 取决于事物的使用方式。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-31
    • 1970-01-01
    • 2017-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多