【发布时间】:2017-12-22 15:43:11
【问题描述】:
隶属于:
请考虑以下代码:
public static class SomeClass
{
public static void Method1(string key, int item)
{
//Some Work
}
public static DataTable Method2()
{
//Some Work
}
....
如果我想从性能的角度在 Asp.Net 应用程序中使用这个类,它是否需要为每个方法提供单独的锁定对象:
public static class SomeClass
{
private Object thisLock1 = new Object();
public static void Method1(string key, int item)
{
lock(thisLock1)
{
//Some Work
}
}
private Object thisLock2 = new Object();
public static DataTable Method2()
{
lock(thisLock2)
{
//Some Work
}
}
....
【问题讨论】:
-
如果这应该是线程安全的,你永远不应该返回实际的
Items集合。返回后,可以在调用者使用它时修改集合。如果您必须返回所有项目,请返回该集合的副本。是的,该复制操作必须被锁定。 -
或者,你知道,使用thread safe collection...
-
不要在
Item类中使用key属性,而是使用Dictionary(或者更确切地说是ConcurrentDictionary) -
理想情况下,编写静态方法,以便多个调用者可以安全地调用它们。由于您所展示的只是签名,因此无法提供要使用的技术。编写每个静态方法以便有效地序列化对该方法的访问通常不是一个好计划。如果您打算使用锁定,那么了解不同的方法如何交互也很重要,我们也无法从这个问题中推断出这一点。简短回答:不要相信您可以学习/应用通用的“总是做 X”规则来获得可接受的性能。
-
我认为没有比我认为重复的“在适当/选择的粒度上使用锁”更好的回答 - stackoverflow.com/questions/5053172/…。
标签: c# asp.net multithreading thread-safety locking