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.
   }
}
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都需要對某個對象進行操作。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM