[英]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.