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
语句。 我认为这只能取代第二个版本。 另外,请记住synchronized
和lock
需要对一个对象进行操作。
请注意,完整path的行: [MethodImpl(MethodImplOptions.Synchronized)]
应该看起来像
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.Synchronized)]