是否每个静态方法都需要锁定对象[重复]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是否每个静态方法都需要锁定对象[重复]相关的知识,希望对你有一定的参考价值。

这个问题在这里已有答案:

相关:

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

....
答案

当您尝试访问对象时,您无需锁定对象,但强烈建议您这样做。

如果您不想自己执行这些锁,Microsoft会添加一个线程安全的类,它是ConcurrentBag Class,它很棒,因为这个逻辑已经实现,因此您可以从多个线程或类中访问和删除它。

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

另一答案

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

不,不

考虑这种情况

你有另一个名为RemoveFromCache的方法,它使用lock3

线程1上的lock3 ItemRemove迭代开始 线程2上的lock1 项目已删除 thread1 Iterator.Next

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

以上是关于是否每个静态方法都需要锁定对象[重复]的主要内容,如果未能解决你的问题,请参考以下文章

多线程

Java方法

需要一种有效的方法来避免使用 Laravel 5 重复代码片段

对象的ArrayList没有正确引用每个对象[重复]

Java多线程---同步与锁

Java同步静态方法:锁定对象或类