C#:线程安全功能

1 c#

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

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;


    }
Run Code Online (Sandbox Code Playgroud)

Nei*_*ell 9

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

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

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

大多.

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

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


Jac*_*icz 8

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


Ant*_*lev 6

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