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]
[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它的锁定this或typeof(Foo)-违反最佳做法。首选选项是使用您自己的锁:
MethodImpl
this
typeof(Foo)
private readonly object syncLock = new object(); public void SomeMethod() { lock(syncLock) { /* code */ } }
注意,对于类似字段的事件,锁定实现取决于编译器。在较旧的Microsoft编译器中,它是lock(this)/ lock(Type)-但是,在较新的编译器中,它使用Interlocked更新-因此线程安全而没有讨厌的部分。
lock(this)
lock(Type)
Interlocked
这允许更精细的使用,并允许使用Monitor.Wait/ Monitor.Pulseetc在线程之间进行通信。
Monitor.Wait
Monitor.Pulse
相关的博客条目(后来重新访问)。