手动locking和同步方法之间的区别

这有什么区别:

internal class MyClass { private readonly object _syncRoot = new Object(); public void DoSomething() { lock(_syncRoot) { ... } } public void DoSomethingElse() { lock(_syncRoot) { ... } } } 

和这个:

 internal class MyClass { [MethodImpl(MethodImplOptions.Synchronized)] public void DoSomething() { ... } [MethodImpl(MethodImplOptions.Synchronized)] public void DoSomethingElse() { ... } } 

我看到的唯一区别是,第一种方法locking一些私人成员,而第二种方法locking实例本身(所以它应该locking实例中的其他一切)。 有什么一般的build议使用的方法? 我目前在我们的项目中发现了两个类似用途的课程,每个课程都用不同的方法写。

编辑:

也许还有一个问题。 这是:

 internal class MyClass { [MethodImpl(MethodImplOptions.Synchronized)] public void DoSomething() { ... } } 

完全一样的是这样的:

 internal class MyClass { public void DoSomething() { lock(this) { ... } } } 

第一种方法是首选,因为你可以(也应该)使_syncRoot私有。 这降低了死锁的风险。

MethodImplOptions.Synchronized是一个早先雄心勃勃的想法的遗留下来,毕竟不是那么好。

关于最后一个问题:是的,根据这个博客他们在function上是等同的(但没有以相同的方式实施)。 所有forms的lock(this)都是因为死锁情况而被阻止的。

请查看http://blogs.msdn.com/b/bclteam/archive/2004/01/20/60719.aspx和http://www.experts-exchange.com/Programming/Languages/C_Sharp/Q_20926988.html
他们也讨论了lock(this)并不鼓励使用它,因为:

完全不相关的代码也可以selectlocking该对象

引用EE:

如果你locking一个对象,那么所有其他需要访问这个特定对象的线程都将等待,直到另一个对象完成。 但是,如果将方法标记为“同步”,则此“特定方法”将不会在多个线程中执行。 Locklocking对象,Synchronizedlocking方法。

只是快速浏览一下,发现便携式设备不支持MethodImplOptions.Synchronized。

还有一句话:

locking实例或types(与Synchronized标志一样)不build议用于公共types,因为除您自己以外的代码可以locking公共types和实例。 这可能会导致死锁或其他同步问题。

来源: http : //msdn.microsoft.com/en-us/library/system.runtime.compilerservices.methodimploptions%28v=VS.100%29.aspx

我认为这种差异将取决于装饰方法中引用的对象。 从我读过的,装饰实际上在IL中实现了lock()。

最好的办法是根据需要做最具体的locking。

本文可能会帮助您: http : //www.yoda.arachsys.com/csharp/threads/lockchoice.shtml

一般来说,我会避免locking“this”,因为私有锁variables提供更好的控制。 如果这是自定义集合类,那么我build议在“this”上加上locking,如果这是需要的话。

Hasanain