[英]C#: Thread safe function
以下哪個代碼是更合適的情況,其中多個線程訪問該函數
public ArrayList CallMe1()
{
ArrayList al = new ArrayList();
lock(al.SyncRoot)
{
al.Add("33");
al.Add("45");
return al;
}
}
public ArrayList CallMe2()
{
ArrayList al = new ArrayList();
Monitor.Enter(al);
al.Add("33");
al.Add("45");
Monitor.Exit(al);
return al;
}
在這種情況下,沒有共享狀態,因此不需要同步。
但是,假設arraylist 為共享狀態,則適用以下條件:
它們都是相同的( 鎖在內部實現Monitor )。
大多。
您的第二個版本需要在finally
塊中釋放監視器,否則,如果代碼引發異常,則鎖定將永遠不會釋放,並會導致應用程序死鎖。
總之,請使用第一個版本( lock (...) {... }
),以避免不必要的輸入和可能的錯誤。
都不行 函數不共享任何數據,因此不需要同步。
都不行 您的函數都沒有共享狀態(只有局部變量),這使它們本質上是可重入的。 不需要任何同步。
正如其他答案所述,鎖使用了Monitor,但它比第二個示例做得更好。 最好是將它包裝要監視的調用放在try finally塊中,以確保在發生異常時釋放鎖定。
因此,我建議您對幾乎所有操作都使用鎖。
1-您不需要在這里鎖。
2-如果可以帶鎖,請不要使用Monitor。
3-在第一個示例中,您要鎖定SyncRoot對象,這比鎖定數組要好。
您還可以在此處找到答案的一部分。
在鎖內部(CallMe1)或外部(CallMe2)的返回語句也沒有區別。
.net 鎖的問題在於,如果發生死鎖,它將不會引發任何異常或任何異常。
順便說一下,您每次都鎖定新創建的ArrayList。 那應該有什么幫助? 我更喜歡在某個地方創建一個靜態對象並對其進行鎖定。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.