繁体   English   中英

C#:线程安全功能

[英]C#: Thread safe function

以下哪个代码是更合适的情况,其中多个线程访问该函数

public ArrayList CallMe1()
    {
        ArrayList al = new ArrayList();

        lock(al.SyncRoot)
        {
            al.Add("33");
            al.Add("45");

            return al;
        }

    }

    public ArrayList CallMe2()
    {

        ArrayList al = new ArrayList();

        Monitor.Enter(al);

        al.Add("33");
        al.Add("45");
        Monitor.Exit(al);

        return al;


    }

在这种情况下,没有共享状态,因此不需要同步。

但是,假设arraylist 共享状态,则适用以下条件:

它们都是相同的( 锁在内部实现Monitor )。

大多。

您的第二个版本需要在finally块中释放监视器,否则,如果代码引发异常,则锁定将永远不会释放,并会导致应用程序死锁。

总之,请使用第一个版本( lock (...) {... } ),以避免不必要的输入和可能的错误。

都不行 函数不共享任何数据,因此不需要同步。

都不行 您的函数都没有共享状态(只有局部变量),这使它们本质上是可重入的。 不需要任何同步。

正如其他答案所述,锁使用了Monitor,但它比第二个示例做得更好。 最好是将它包装要监视的调用放在try finally块中,以确保在发生异常时释放锁定。

因此,我建议您对几乎所有操作都使用锁。

1-您不需要在这里锁。

2-如果可以带锁,请不要使用Monitor。

3-在第一个示例中,您要锁定SyncRoot对象,这比锁定数组要好。

您还可以在此处找到答案的一部分。

在锁内部(CallMe1)或外部(CallMe2)的返回语句也没有区别。

.net 的问题在于,如果发生死锁,它将不会引发任何异常或任何异常。

顺便说一下,您每次都锁定新创建的ArrayList。 那应该有什么帮助? 我更喜欢在某个地方创建一个静态对象并对其进行锁定。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM