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

2022-08-31 04:53:49

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

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

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

public void doImportantStuff() {
   // trivial stuff

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

答案 1

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

就个人而言,我不喜欢它的实现,因为它锁定或 - 这违反了最佳实践。首选选项是使用您自己的锁:MethodImplthistypeof(Foo)

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

请注意,对于类似字段的事件,锁定实现依赖于编译器;在较旧的Microsoft编译器中,它是一个/ - 但是,在最近的编译器中,它使用互锁更新 - 因此线程安全,没有令人讨厌的部分。lock(this)lock(Type)

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

相关的博客文章(后来重新访问)。


答案 2
static object Lock = new object();

lock (Lock) 
{
// do stuff
}