gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 03:48:01 25 4
gpt4 key购买 nike

这有什么区别吗:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com