首页 文章

C#版的java的synchronized关键字?

提问于
浏览
260

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

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

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

要么

public void doImportantStuff() {
   // trivial stuff

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

5 回答

  • 7

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

  • 38

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

    在C#中,您明确地希望跨异步线程同步工作的资源是 lock . lock 打开一个街区;它不适用于方法级别 .

    但是,底层机制类似,因为 lock 通过在运行时调用Monitor.Enter(以及随后的 Monitor.Exit )来工作 . 根据Sun documentation,Java的工作方式相同 .

  • 418
    static object Lock = new object();
    
    lock (Lock) 
    {
    // do stuff
    }
    
  • 5

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

  • 51

    请注意,使用完整路径的行: [MethodImpl(MethodImplOptions.Synchronized)] 应该是这样的

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

相关问题