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. } } 

首先,绝大多数类永远不需要线程安全。 使用YAGNI :只有当你知道你真的要使用它(并testing它)时才应用线程安全。

对于方法级别的东西,有[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的实现,因为它locking了this或者typeof(Foo) – 这是违背最佳实践的。 首选的方法是使用自己的锁:

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

请注意,对于类似字段的事件,locking实现取决于编译器; 在较老的微软编译器中,它是一个lock(this) / lock(Type) – 然而, 在最近的编译器中它使用了Interlocked更新 – 所以线程安全,没有讨厌的部分。

这允许更细粒度的使用,并允许使用Monitor.Wait / Monitor.Pulse等线程之间进行通信。

相关的博客条目 (稍后再访 )。

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

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

在C#中,您显式地lock了希望在asynchronous线程上同步处理的资源。 lock打开一个块; 它在方法级别上不起作用。

但是,底层的机制是相似的,因为lock通过在运行时调用Monitor.Enter (以及随后的Monitor.Exit )来工作。 根据Sun的文档 ,Java的工作原理是一样的。

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

请注意,完整path的行: [MethodImpl(MethodImplOptions.Synchronized)]应该看起来像

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