Raleted to:
请考虑以下代码:
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
}
}
....
答案 0 :(得分:2)
每个静态方法都需要锁定对象
不,否
考虑这种情况
您有另一个名为GetAllItems
的方法,它使用lock3
线程1上的lock3
ItemRemove迭代开始
线程2上的lock1
物品已删除
thread1 Iterator.Next
由于集合修改而在thread1上出现异常。任何人都可以使用{{1}}方法获取集合的实例。使用私人锁定很难强制执行线程安全。您应该考虑使用其中一个线程安全集合。
答案 1 :(得分:2)
当您尝试访问该对象时,您无需锁定该对象,但强烈建议您这样做。
如果您不想自己执行这些锁,Microsoft会添加一个线程安全的类,它是ConcurrentBag Class,这很好,因为这个逻辑已经实现,因此您可以从多个线程访问和删除它或者类。
但是,锁可以更好地控制列表访问。 Check this link for examples of bag implementation.