java's synchronized关键字的c#版本?

c#有它自己版本的java "synchronized"关键字吗?

也就是说,在java中,它可以被指定为一个函数、一个对象或一段代码,如下所示:

public synchronized void doImportantStuff() {
// dangerous code goes here.
}

public void doImportantStuff() {
// trivial stuff


synchronized(someLock) {
// dangerous code goes here.
}
}
208386 次浏览

c#有它自己版本的java "synchronized"关键字吗?

不。在c#中,你显式地lock资源,你想要跨异步线程同步工作。lock打开一个块;它在方法级别上不起作用。

然而,底层机制是类似的,因为lock通过在运行时调用Monitor.Enter(以及随后的Monitor.Exit)来工作。Java的工作方式是相同的,根据太阳的文档

static object Lock = new object();


lock (Lock)
{
// do stuff
}

你可以使用lock语句代替。我认为这只能代替第二个版本。另外,要记住synchronizedlock都需要对对象进行操作。

首先,大多数类永远不需要是线程安全的。使用YAGNI:只有当你知道你真的要使用它(并测试它)时才应用线程安全。

对于方法级的东西,有[MethodImpl]:

[MethodImpl(MethodImplOptions.Synchronized)]
public void SomeMethod() {/* code */}

这也可以用于访问器(属性和事件):

private int i;
public int SomeProperty
{
[MethodImpl(MethodImplOptions.Synchronized)]
get { return i; }
[MethodImpl(MethodImplOptions.Synchronized)]
set { i = value; }
}

注意,类字段事件默认是同步的,而自动实现的属性:

public int SomeProperty {get;set;} // not synchronized
public event EventHandler SomeEvent; // synchronized

就我个人而言,我不喜欢MethodImpl的实现,因为它锁定了thistypeof(Foo)——这违背了最佳实践。最好使用自己的锁:

private readonly object syncLock = new object();
public void SomeMethod() {
lock(syncLock) { /* code */ }
}

注意,对于类字段事件,锁定实现依赖于编译器;在旧的微软编译器中,它是lock(this) / lock(Type) -然而,在最近的编译器中,它使用Interlocked更新-所以线程安全,没有讨厌的部分。

这允许更细粒度的使用,并允许使用Monitor.Wait/Monitor.Pulse等在线程之间进行通信。

相关的博客条目(后来的重新审视)。

注意,对于全路径,行:[MethodImpl(MethodImplOptions.Synchronized)]应该是这样的

[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.Synchronized)]