2009-09-04 47 views
1

我的C#ASP.NET項目中有一個靜態變量(抽象數據類型,不是原語)。在asp.net中讀取/寫入鎖定靜態變量

它會被許多線程併發地和頻繁地讀取。

我需要很少寫入(與讀取次數相比)。

確保threadsaftey的最好方法是什麼,以便在寫入它時,其他線程不會讀取部分寫入的數據?

我只用過lock,但我知道這將防止併發讀取:(

感謝

回答

5

我開始只是lock無可爭議的鎖是很便宜你可能使用ReaderWriterLockSlim(假設你使用.N。 ET 3.5),但鎖定更容易。如果/出現問題,請優化它。

ReaderWriterLock可能比簡單的鎖 - 這不是因爲快,因爲它可能會,因此瘦身版:)

究竟有多頻繁,你的「經常」呢?你期望多少爭用?您可能想要對其進行建模(例如,模擬合理數量的請求),並基準沒有鎖定與簡單鎖定,只是查看開銷是多少。

可能能夠使用無鎖選項volatile - 但坦率地說,我最近放棄了這一點,因爲理智的人理智太難了。 (這並不意味着我的意思。)

你究竟在做什麼數據?類型是不可變的類型,所以一旦你有正確的引用,你可以讀取一個線程安全的方式沒有任何鎖定?

+0

好advice-這是,除非你瞭解它,你最終可能會做出錯誤的選擇了.NET框架怪事之一。 – RichardOD 2009-09-04 10:54:59

+0

@ Andrew-如果你想了解更多關於它的文章,這裏有一篇很好的文章 - http://blogs.msdn.com/pedram/archive/2007/10/07/a-performance-comparison-of-readerwriterlockslim-with-readerwriterlock .aspx – RichardOD 2009-09-04 10:57:23

+0

感謝您的建議。我會閱讀每一個請求,所以頻繁出現流量。寫作將按照每天一次的順序進行。 – 2009-09-04 11:10:19

0

感謝您的幫助,我已經解決了這種方法,直到性能成爲問題。據推測,這是正確的(線程),其中SharedResource是不可改變的

public static class SharedResourceManager 
{ 
    private static readonly object syncLock = new object(); 

    private static SharedResource res { get; set; } 

    public static SharedResource Resource 
    { 
     get 
     { 
      lock (syncLock) 
       return res; 
     } 
     set 
     { 
      lock(syncLock) 
       res = value; 
     } 
    } 
} 
+0

以下發布了我的解決方案是的,這很安全。使用一個易變的私有變量也可能會好起來。任何理由你使用一個屬性'res',因爲它是私人的? – 2009-09-04 14:03:19

+0

感謝您的幫助:)沒有理由,將其刪除;) – 2009-09-04 14:47:00