Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 锁定性能锁定多个列表_C#_Multithreading_Locking - Fatal编程技术网

C# 锁定性能锁定多个列表

C# 锁定性能锁定多个列表,c#,multithreading,locking,C#,Multithreading,Locking,我应该使用2个锁变量还是1个就足够了,它会影响性能吗?如果我有3个或4个从多个线程调用的方法呢 publicstaticclass愚弄 { 私有静态对象_syncRoot=新对象(); 私有静态列表_list1; 私有静态列表_list2; 公众胡闹 { _list1=新列表(); _list2=新列表(); } 公共无效方法1(字符串s1) { 锁定(\u syncRoot) { _列表1.添加(s1); } } 公共void方法2(字符串s2) { 锁定(\u syncRoot) { _列表

我应该使用2个锁变量还是1个就足够了,它会影响性能吗?如果我有3个或4个从多个线程调用的方法呢

publicstaticclass愚弄
{
私有静态对象_syncRoot=新对象();
私有静态列表_list1;
私有静态列表_list2;
公众胡闹
{
_list1=新列表();
_list2=新列表();
}
公共无效方法1(字符串s1)
{
锁定(\u syncRoot)
{
_列表1.添加(s1);
}
}
公共void方法2(字符串s2)
{
锁定(\u syncRoot)
{
_列表2.添加(s2);
}
}
}
鉴于此,将列表1和列表2自身锁定是否正确

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

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

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

每个对象单独的锁定变量可能有助于提高性能,但代价是增加复杂性。也就是说,如果在一个方法中同时使用两个列表,并且需要同时锁定这两个列表,那么两个锁定变量会增加一个列表的可能性,因此需要格外小心

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

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

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

每个对象单独的锁定变量可能有助于提高性能,但代价是增加复杂性。也就是说,如果您在一个方法中同时使用两个列表,并且需要同时锁定它们,那么两个锁定变量会增加一个的可能性,因此需要格外小心。

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

或者换句话说,如果4个锁对你的应用程序来说太慢了,你需要完全改变方法,转而寻找无锁算法,这是非常重要的

我会说有一百把锁看起来可疑,但我甚至不会浪费时间去问它。

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

或者换句话说,如果4个锁对你的应用程序来说太慢了,你需要完全改变方法,转而寻找无锁算法,这是非常重要的


<>我想说一百的锁看起来可疑,但3-4我甚至不会浪费时间去问它。< /p>如果使用,net 4,你认为我想在<代码>方法2>代码>中添加一个条目给<代码>否则,他们只是两种方法做相同的事情。@ AdulestC&P错误,我纠正了ITIF使用,NET 4,你认为我想你要添加一个项目到<代码>否则它们只是两种做同样事情的方法。@AdiLester c&p错误,我纠正了它,“可以减少”是什么意思?如果我在3个列表上使用3种方法,那么使用3个锁变量会快3倍吗?还是会快1 1/100倍?没有方法会同时使用这两个列表。@RobertP。这些方法必须互相等待,这意味着长时间运行的方法将在整个运行过程中阻塞较短的方法-基本上,在任何时候,使用任何列表只能得到一个线程。这可能是一个瓶颈,也可能不是——这取决于事物的使用方式。你说的“可以减少”是什么意思?如果我在3个列表上使用3种方法,那么使用3个锁变量会快3倍吗?还是会快1 1/100倍?没有方法会同时使用这两个列表。@RobertP。这些方法必须互相等待,这意味着长时间运行的方法将在整个运行过程中阻塞较短的方法-基本上,在任何时候,使用任何列表只能得到一个线程。这可能是一个瓶颈,也可能不是——这取决于事物的使用方式。