每个静态方法都需要锁定对象

时间:2017-12-22 15:43:11

标签: c# asp.net multithreading thread-safety locking

Raleted to:

Lock in static methods

lock Statement

请考虑以下代码:

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
        }
    } 

....

2 个答案:

答案 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.