簡體   English   中英

C#:線程安全功能

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM