C#版的java的synchronized关键字?

时间:2009-02-12 13:23:18

标签: c# java multithreading synchronization

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

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

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

public void doImportantStuff() {
   // trivial stuff

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

5 个答案:

答案 0 :(得分:437)

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

答案 1 :(得分:54)

static object Lock = new object();

lock (Lock) 
{
// do stuff
}

答案 2 :(得分:38)

  

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

没有。在C#中,您明确地lock要在异步线程上同步工作的资源。 lock打开一个街区;它不适用于方法级别。

但是,基础机制类似,因为lock通过在运行时调用Monitor.Enter(以及随后的Monitor.Exit)来工作。根据{{​​3}},Java的工作方式相同。

答案 3 :(得分:7)

请注意,使用完整路径时,行[MethodImpl(MethodImplOptions.Synchronized)]应该看起来像

[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.Synchronized)]

答案 4 :(得分:5)

您可以改用lock语句。我认为这只能取代第二个版本。另外,请记住,synchronizedlock都需要对某个对象进行操作。