如何解决手动锁定和同步方法之间的区别
|| 之间有什么区别: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()
{
...
}
}
我看到的唯一区别是,第一种方法锁定某些私有成员,而第二种方法锁定实例本身(因此它应锁定实例中的所有其他对象)。是否有使用哪种方法的一般建议?我目前在我们的项目中发现了两个目的相似的类,每个类都使用不同的方法编写。
编辑:
也许还有一个问题。这是:
internal class MyClass
{
[MethodImpl(MethodImplOptions.Synchronized)]
public void DoSomething()
{
...
}
}
完全一样:
internal class MyClass
{
public void DoSomething()
{
lock(this)
{
...
}
}
}
解决方法
首选第一种方法,因为您可以(并且应该)将“ 4”设为私有。这降低了死锁的风险。
“ 5”是一个较早的雄心勃勃的想法的遗留物,后来发现它并不是那么好。
关于最后一个问题:是的,根据此博客,它们在功能上是等效的(但实现方式不同)。再次由于死锁情况,不鼓励所有形式的“ 6”。
,查看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)
,并因为以下原因而劝阻它:
完全不相关的代码也可以选择锁定该对象
从EE引用:
如果锁定对象,则需要访问此特定对象的所有其他线程将等待,直到另一个对象完成。但是,如果将一种方法标记为“已同步”,则此特殊方法将不会在多个线程上执行。锁保护对象,同步保护方法。
,快速浏览后发现便携式设备不支持MethodImplOptions.Synchronized。
还有一个备注:
锁定实例或
类型,与同步标志一样,
不建议用于公共类型,
因为除了您自己的代码以外
锁定公共类型和
实例。这可能会导致死锁
或其他同步问题。
来源:http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.methodimploptions%28v=VS.100%29.aspx
,我认为差异取决于装饰方法中引用的对象。根据我的阅读,装饰实际上在IL中实现了lock()。
最好的方法是根据需要进行最具体的锁定。
,本文可能会帮助您:http://www.yoda.arachsys.com/csharp/threads/lockchoice.shtml
通常,我会避免锁定\'this \',因为私有锁定变量可以提供更好的控制。如果这是自定义集合类,则建议锁定\'this \'(如果需要的话),类似于SyncRoot。
哈萨那
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。