C#版的java synchronized关键字?


C#版的java synchronized关键字?

c#是否有自己的java“synchronized”关键字版本?

即 在java中,它可以指定为函数,对象或代码块,如下所示:

public synchronized void doImportantStuff() {
   // dangerous code goes here.
}

要么

public void doImportantStuff() {
   // trivial stuff

   synchronized(someLock) {
      // dangerous code goes here.
   }
}
java c# multithreading synchronization Soraz asked 2019-02-22T18:55:33Z 5个解决方案 418 votes

首先 - 大多数类永远不需要是线程安全的。 使用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

就个人而言,我不喜欢执行Monitor.Wait,因为它锁定了Monitor.Pulsetypeof(Foo) - 这是最佳做法。 首选方法是使用自己的锁:

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

请注意,对于类似字段的事件,锁定实现依赖于编译器; 在较旧的Microsoft编译器中它是Monitor.Wait/Monitor.Pulse - 但是,在最近的编译器中它使用Monitor.Wait更新 - 所以线程安全没有讨厌的部分。

这允许更细粒度的使用,并允许使用Monitor.Wait/Monitor.Pulse等在线程之间进行通信。

相关博客条目(稍后重访)。

Marc Gravell answered 2019-02-22T18:56:30Z 51 votes
static object Lock = new object();

lock (Lock) 
{
// do stuff
}
Jan Gressmann answered 2019-02-22T18:56:49Z 38 votes

c#是否有自己的java“synchronized”关键字版本?

在C#中,您明确要在异步线程上同步处理Monitor.Enter资源。 Monitor.Exit开了一个街区; 它不适用于方法级别。

但是,基础机制类似,因为Monitor.Enter通过在运行时调用Monitor.Enter(以及随后的Monitor.Exit)来工作。 根据Sun文档,Java的工作方式相同。

Konrad Rudolph answered 2019-02-22T18:57:24Z 7 votes

请注意,完整路径:[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.Synchronized)]应该是这样的

[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.Synchronized)]

Traubenfuchs answered 2019-02-22T18:57:57Z 5 votes

您可以改用lock语句。 我认为这只能取代第二个版本。 另外,请记住,synchronizedlock都需要对某个对象进行操作。

James answered 2019-02-22T18:58:22Z 参考:https://www.itranslater.com/qa/details/2113684026149045248

相关