【发布时间】:2011-09-02 15:50:53
【问题描述】:
这有什么区别:
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)
{
...
}
}
}
【问题讨论】:
-
@Winston:太好了。我的问题几乎是重复的。
-
我会将属性形式视为对编译器的“礼貌建议”。我不确定他们是否受标准的约束来遵循它。而显式使用
lock语句会强制执行编译时间要求。 -
@sixlet 礼貌的建议不会很有用/可靠,不是吗?
-
@Henk:我只是说我不记得它被任何标准锁定为“必须由合规的 CLR 实施”。
标签: c# .net multithreading locking