gpt4 book ai didi

java的同步关键字的C#版本?

转载 作者:bug小助手 更新时间:2023-10-28 10:38:06 27 4
gpt4 key购买 nike

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

即在 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的同步关键字的C#版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/541194/

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