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

问题描述

|| 之间有什么区别:
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。 哈萨那     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...