c# 是否有自己的 java“同步”关键字版本?
即在 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; }
}
请注意,类字段事件是默认同步的,而自动实现的属性不是:
public int SomeProperty {get;set;} // not synchronized
public event EventHandler SomeEvent; // synchronized
就个人而言,我不喜欢 MethodImpl
的实现,因为它会锁定 this
或 typeof(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 )。
我是一名优秀的程序员,十分优秀!