是否每个静态方法都需要锁定对象[重复]
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是否每个静态方法都需要锁定对象[重复]相关的知识,希望对你有一定的参考价值。
这个问题在这里已有答案:
相关:
请考虑以下代码:
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
}
}
....
答案
当您尝试访问对象时,您无需锁定对象,但强烈建议您这样做。
如果您不想自己执行这些锁,Microsoft会添加一个线程安全的类,它是ConcurrentBag Class,它很棒,因为这个逻辑已经实现,因此您可以从多个线程或类中访问和删除它。
但是,锁可以更好地控制列表访问。 Check this link for examples of bag implementation.
另一答案
每个静态方法都需要锁定对象
不,不
考虑这种情况
你有另一个名为RemoveFromCache
的方法,它使用lock3
线程1上的lock3 ItemRemove迭代开始 线程2上的lock1 项目已删除 thread1 Iterator.Next
由于集合已修改,因此在thread1上有异常。任何人都可以使用GetAllItems
方法获取集合的实例。使用私人锁定很难强制执行线程安全。您应该考虑使用其中一个线程安全集合。
以上是关于是否每个静态方法都需要锁定对象[重复]的主要内容,如果未能解决你的问题,请参考以下文章