一尘不染

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

c#

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

即在Java中,可以将其指定为函数,对象或代码块,如下所示:

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

要么

public void doImportantStuff() {
   // trivial stuff

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

阅读 239

收藏
2020-05-19

共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

就我个人而言,我不喜欢实现MethodImpl它的锁定thistypeof(Foo)-违反最佳做法。首选选项是使用您自己的锁:

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

注意,对于类似字段的事件,锁定实现取决于编译器。在较旧的Microsoft编译器中,它是lock(this)/
lock(Type)-但是,在较新的编译器中,它使用Interlocked更新-因此线程安全而没有讨厌的部分。

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

相关的博客条目(后来重新访问)。

2020-05-19