gpt4 book ai didi

java的synchronized关键字的C#版本?

转载 作者:行者123 更新时间:2023-12-01 05:53:02 29 4
gpt4 key购买 nike

c# 是否有自己版本的 java“synchronized”关键字?

即在 java 中,它可以指定为函数、对象或代码块,如下所示:

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

public void doImportantStuff() {
// trivial stuff

synchronized(someLock) {
// dangerous code goes here.
}
}

最佳答案

首先 - 大多数类永远不需要线程安全。使用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 */ }
}

请注意,对于类似字段的事件,锁定实现取决于编译器;在较旧的 Microsoft 编译器中,它是一个 lock(this)/lock(Type) - 但是,in more recent compilers it uses Interlocked更新 - 因此线程安全,没有令人讨厌的部分。

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

相关blog entry (稍后revisited)。

关于java的synchronized关键字的C#版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3982135/

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