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

标签 c# .net multithreading 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() 
    {
        ...
    }
}

我看到的唯一区别是第一种方法锁定某个私有(private)成员,而第二种方法锁定实例本身(因此它应该锁定实例中的所有其他内容)。是否有任何一般建议使用哪种方法?我目前在我们的项目中发现了两个目的相似的类,每个类都是用不同的方法编写的。

编辑:

也许还有一个问题。这是:

internal class MyClass
{
    [MethodImpl(MethodImplOptions.Synchronized)]
    public void DoSomething() 
    {
        ...
    }
}

完全一样:

internal class MyClass
{
    public void DoSomething() 
    {
        lock(this) 
        {
            ...
        }
    }
}

最佳答案

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

MethodImplOptions.Synchronized 是早期雄心勃勃的想法的遗留物,但最终证明并不是那么好。

关于最后一个问题:是的,根据this blog它们在功能上是等价的(但实现方式不同)。并且所有形式的 lock(this) 都是不鼓励的,同样是因为死锁情况。

关于c# - 手动锁定和同步方法之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6140048/

相关文章:

c# - 由于 CLR.dll Windows 应用程序崩溃 - Windows 2008 R2 Server

c# - 我应该使用 .NET (System.Net.Mail) 来批量发送我的 Web 应用程序的电子邮件还是 SQL (msdb.sp_send_dbmail)?

java - 多线程环境下迭代集合: ConcurrentModificationException

java - 检测写入标准错误流

Java 线程 - 两个 while 循环

c# - 正则表达式匹配这些词,但排除与这些匹配

c# - 如何将 'system.collections.generic.list ' 转换为 'system.data.datatable'

c# - 我们可以强制 WPF 使用 WARP 而不是其内部软件渲染器吗?

c# - 核心 API Controller 捕获所有未知路由

c# - 密封类中没有主体的虚拟方法