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

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)

Hen*_*man 38

第一种方法是首选方法,因为您可以(并且应该)将_syncRoot设为私有.这降低了死锁的风险.

_syncRoot是一个早先雄心勃勃的想法遗留下来,毕竟事实并非如此.

关于最后一个问题:是的,根据这个博客,它们在功能上是等价的(但没有以相同的方式实现).并且MethodImplOptions.Synchronized由于死锁情况,所有形式都不鼓励.

  • 其他公众可用性. (3认同)

Kam*_*yar 13

查看http://blogs.msdn.com/b/bclteam/archive/2004/01/20/60719.aspxhttp://www.experts-exchange.com/Programming/Languages/C_Sharp/Q_20926988.html
他们lock(this)从那以后讨论并且不鼓励使用它,因为:

完全不相关的代码也可以选择锁定该对象

来自EE的引言:

如果锁定对象,则需要访问此特定对象的所有其他线程将等待,直到另一个对象完成.但是,如果将方法标记为已同步,则不会在多个线程上执行此特定方法.Lock保护对象,Synchronized保护方法.

  • 第二个引用+1.这是IMO这两种机制之间最重要的区别. (2认同)

Woj*_*icz 8

只是快速查看并发现便携式设备不支持MethodImplOptions.Synchronized.

还有一句话:

锁定的实例或类型,与同步标志,不建议用于公共类型,因为其他的代码比你自己可以承担的公共类型和实例锁.这可能会导致死锁或其他同步问题.

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