c#是否有自己的java“synchronized”关键字版本?
即在java中,它可以指定为函数,对象或代码块,如下所示:
public synchronized void doImportantStuff() {
// dangerous code goes here.
}
要么
public void doImportantStuff() {
// trivial stuff
synchronized(someLock) {
// dangerous code goes here.
}
}
5 回答
您可以改用
lock
语句 . 我认为这只能取代第二个版本 . 另外,请记住synchronized
和lock
都需要对一个对象进行操作 .在C#中,您明确地希望跨异步线程同步工作的资源是
lock
.lock
打开一个街区;它不适用于方法级别 .但是,底层机制类似,因为
lock
通过在运行时调用Monitor.Enter(以及随后的Monitor.Exit
)来工作 . 根据Sun documentation,Java的工作方式相同 .首先 - 大多数类永远不需要是线程安全的 . 使用YAGNI:只有在知道实际要使用它时才应用线程安全(并测试它) .
对于方法级别的东西,有
[MethodImpl]
:这也可用于访问器(属性和事件):
请注意,默认情况下,类似字段的事件是同步的,而自动实现的属性不是:
就个人而言,我不喜欢
MethodImpl
的实现,因为它锁定this
或typeof(Foo)
- 这是最佳做法 . 首选方法是使用自己的锁:请注意,对于类似字段的事件,锁定实现依赖于编译器;在较旧的Microsoft编译器中,它是
lock(this)
/lock(Type)
- 但是,in more recent compilers it uses Interlocked更新 - 所以线程安全没有讨厌的部分 .这允许更细粒度的使用,并允许使用
Monitor.Wait
/Monitor.Pulse
等在线程之间进行通信 .一个相关的blog entry(后来revisited) .
请注意,使用完整路径的行:
[MethodImpl(MethodImplOptions.Synchronized)]
应该是这样的[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.Synchronized)]