Lad*_*nka 55 .net c# multithreading locking
这有什么区别:
internal class MyClass
{
private readonly object _syncRoot = new Object();
public void DoSomething()
{
lock(_syncRoot)
{
...
}
}
public void DoSomethingElse()
{
lock(_syncRoot)
{
...
}
}
}
Run Code Online (Sandbox Code Playgroud)
还有这个:
internal class MyClass
{
[MethodImpl(MethodImplOptions.Synchronized)]
public void DoSomething()
{
...
}
[MethodImpl(MethodImplOptions.Synchronized)]
public void DoSomethingElse()
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
我看到的唯一区别是第一种方法锁定某个私有成员,而第二种方法锁定实例本身(因此它应该锁定实例中的其他所有内容).是否有任何使用方法的一般建议?我目前在项目中发现了两个具有相似目的的类,每个类都用不同的方法编写.
编辑:
也许还有一个问题.这是:
internal class MyClass
{
[MethodImpl(MethodImplOptions.Synchronized)]
public void DoSomething()
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
完全相同:
internal class MyClass
{
public void DoSomething()
{
lock(this)
{
...
}
}
}
Run Code Online (Sandbox Code Playgroud)
Kam*_*yar 13
查看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的引言:
如果锁定对象,则需要访问此特定对象的所有其他线程将等待,直到另一个对象完成.但是,如果将方法标记为已同步,则不会在多个线程上执行此特定方法.Lock保护对象,Synchronized保护方法.
只是快速查看并发现便携式设备不支持MethodImplOptions.Synchronized.
还有一句话:
锁定的实例或类型,与同步标志,不建议用于公共类型,因为其他的代码比你自己可以承担的公共类型和实例锁.这可能会导致死锁或其他同步问题.
来源:http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.methodimploptions%28v=VS.100%29.aspx