Java同步关键字的C#版本?

Java同步关键字的C#版本?,第1张

Java同步关键字的C#版本?

首先-
大多数类将永远不需要是线程安全的。使用YAGNI:仅当您知道实际上将要使用它(并对其进行测试)时,才应用线程安全性。

对于方法级的东西,有

[MethodImpl]

[MethodImpl(MethodImplOptions.Synchronized)]public void SomeMethod() {}

这也可以用于访问器(属性和事件):

private int i;public int SomeProperty{    [MethodImpl(MethodImplOptions.Synchronized)]    get { return i; }    [MethodImpl(MethodImplOptions.Synchronized)]    set { i = value; }}

请注意,默认情况下,类似字段的事件 同步的,而自动实现的属性 则不是

public int SomeProperty {get;set;} // not synchronizedpublic event EventHandler SomeEvent; // synchronized

就我个人而言,我不喜欢实现

MethodImpl
它的锁定
this
typeof(Foo)
-违反最佳做法。首选选项是使用您自己的锁:

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

注意,对于类似字段的事件,锁定实现取决于编译器。在较旧的Microsoft编译器中,它是

lock(this)
/
lock(Type)
-但是,在较新的编译器中,它使用
Interlocked
更新-因此线程安全而没有讨厌的部分。

这允许更精细的使用,并允许使用

Monitor.Wait
/
Monitor.Pulse
etc在线程之间进行通信。

相关的博客条目(后来重新访问)。



欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5567478.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-14
下一篇2022-12-14

发表评论

登录后才能评论

评论列表(0条)

    保存