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首先 - 大多數類永遠不需要是執行緒安全的。 使用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.Pulse
或typeof(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 votesstatic 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的工作方式相同。
請注意,完整路徑:[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.Synchronized)]
應該是這樣的
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.Synchronized)]
您可以改用lock
語句。 我認為這隻能取代第二個版本。 另外,請記住,synchronized
和lock
都需要對某個物件進行操作。