我们有一个记录器应用程序的接口,它可能有不同的实现。作为记录器,实现的对象可以在多个模块之间共享,因此需要同步。
我正在使用此代码使方法同步:[MethodImpl(MethodImplOptions.Synchronized)]
我的查询是:如果我在界面中使用此注释,它会使所有实现同步吗?或者,我需要将此注释放在具体实现中吗?
答案 0 :(得分:3)
它在界面上没有用,因为MethodImplAttribute
本身标记为AttributeUsageAttribute.Inherited = false
但无论如何,这是一种反模式,文档说
不建议对公共类型锁定实例或类型(如
Synchronized
标志),因为除您自己以外的代码可以对公共类型和实例进行锁定。这可能会导致死锁或其他同步问题。
相反,实现应该锁定(如果不是内部线程安全)object
的{{1}}实例到该类。
声明性同步的问题是众所周知的 - 它会导致锁定顺序反转 - 因此反对使用它的建议是通用的。
答案 1 :(得分:1)
[MethodImpl(MethodImplOptions.Synchronized)]
是一个古老的想法,结果证明是非常糟糕的。
如果您查看MSDN上的文档,您会看到
静态方法锁定类型,而实例方法锁定 实例强>
因为您使用的是界面,并且已经指出MethodImplAttribute
标有AttributeUsageAttribute.Inherited = false
,因此您的实现将锁定到this
,这是被接受的作为一种非常糟糕的模式,最终导致死锁。