Java中的synchronized关键字在C#中对应什么?

28 浏览
0 Comments

Java中的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.
   }
}

admin 更改状态以发布 2023年5月21日
0
0 Comments
static object Lock = new object();
lock (Lock) 
{
// do stuff
}

(原文不需翻译)

0
0 Comments

首先 - 大多数类永远不需要线程安全。使用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.Pulse等在线程之间进行通信。

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

0