手动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