C#版本的java的synchronized关键字?

问题:

c#有自己的java“synchronized”关键字的版本吗?
即在java中,可以指定一个函数,一个对象或一个代码块,像这样:

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

要么

public void doImportantStuff() {
   // trivial stuff

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

回答:

第一 – 大多数类永远不需要线程安全。使用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; }
}

请注意,默认情况下同步的字段事件are,而自动实现的属性are not

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)。

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: C# version of java’s synchronized keyword?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

99 − 89 =