在C#中使用同步方法的位置:接口或实现?

时间:2018-02-05 04:17:24

标签: c# multithreading interface

我们有一个记录器应用程序的接口,它可能有不同的实现。作为记录器,实现的对象可以在多个模块之间共享,因此需要同步。

我正在使用此代码使方法同步:[MethodImpl(MethodImplOptions.Synchronized)]

我的查询是:如果我在界面中使用此注释,它会使所有实现同步吗?或者,我需要将此注释放在具体实现中吗?

2 个答案:

答案 0 :(得分:3)

它在界面上没有用,因为MethodImplAttribute本身标记为AttributeUsageAttribute.Inherited = false

但无论如何,这是一种反模式,文档说

  

不建议对公共类型锁定实例或类型(如Synchronized标志),因为除您自己以外的代码可以对公共类型和实例进行锁定。这可能会导致死锁或其他同步问题。

相反,实现应该锁定(如果不是内部线程安全)object的{​​{1}}实例到该类。

声明性同步的问题是众所周知的 - 它会导致锁定顺序反转 - 因此反对使用它的建议是通用的。

答案 1 :(得分:1)

[MethodImpl(MethodImplOptions.Synchronized)]是一个古老的想法,结果证明是非常糟糕的。

如果您查看MSDN上的文档,您会看到

  

静态方法锁定类型,而实例方法锁定   实例

因为您使用的是界面,并且已经指出MethodImplAttribute标有AttributeUsageAttribute.Inherited = false,因此您的实现将锁定到this,这是被接受的作为一种非常糟糕的模式,最终导致死锁。