当前位置:  开发笔记 > 编程语言 > 正文

C#:线程安全功能

如何解决《C#:线程安全功能》经验,为你挑选了3个好方法。

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

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;


    }

Neil Barnwel.. 9

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

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

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

大多.

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

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



1> Neil Barnwel..:

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

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

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

大多.

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

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



2> Jacek Ławryn..:

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



3> Anton Gogole..:

都不是.您的所有函数都没有共享状态(只有局部变量),这使得它们本身就是可重入的.无论如何都不需要同步.

推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有