【问题标题】:Is lock object deparatly necessary for every static methods [duplicate]每个静态方法都需要锁定对象吗[重复]
【发布时间】:2017-12-22 15:43:11
【问题描述】:

隶属于:

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

....

【问题讨论】:

  • 如果这应该是线程安全的,你永远不应该返回实际的Items 集合。返回后,可以在调用者使用它时修改集合。如果您必须返回所有项目,请返回该集合的副本。是的,该复制操作必须被锁定。
  • 或者,你知道,使用thread safe collection...
  • 不要在Item 类中使用key 属性,而是使用Dictionary(或者更确切地说是ConcurrentDictionary
  • 理想情况下,编写静态方法,以便多个调用者可以安全地调用它们。由于您所展示的只是签名,因此无法提供要使用的技术。编写每个静态方法以便有效地序列化对该方法的访问通常不是一个好计划。如果您打算使用锁定,那么了解不同的方法如何交互也很重要,我们也无法从这个问题中推断出这一点。简短回答:不要相信您可以学习/应用通用的“总是做 X”规则来获得可接受的性能。
  • 我认为没有比我认为重复的“在适当/选择的粒度上使用锁”更好的回答 - stackoverflow.com/questions/5053172/…

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


【解决方案1】:

当您尝试访问该对象时,您不必锁定它,但强烈建议这样做。

如果你不想自己执行这些锁,微软添加了一个线程安全的类,它是ConcurrentBag Class,这很好,因为这个逻辑已经实现了,所以你可以从多个线程或类中访问和删除它.

但是,锁可以让您更好地控制列表访问。 Check this link for examples of bag implementation.

【讨论】:

  • 我更新了我的问题
【解决方案2】:

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

不,不

考虑这种情况

你有另一个方法叫做RemoveFromCache,它使用了lock3

线程 1 上的 lock3
ItemRemove 迭代开始
线程 2 上的 lock1
物品已移除
thread1 迭代器.Next

由于集合已修改,线程 1 出现异常。任何人都可以使用GetAllItems 方法获取集合的实例。使用私有锁很难强制执行线程安全。您应该考虑改用其中一个线程安全集合。

【讨论】:

  • 谢谢,如果没有共享属性(这里Items)有必要吗?
  • 它从来没有必要,但是如果操作是隔离的,那么使用单独的锁会更有效
  • 我更新了我的问题
  • @Arian 确实是个案情况。根据您的工作内容,您甚至可能不需要锁。或者你需要在某些地方使用相同的锁,但在其他地方不需要
猜你喜欢
  • 1970-01-01
  • 2017-10-31
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多