我的C#ASP.NET項目中有一個靜態變量(抽象數據類型,不是原語)。在asp.net中讀取/寫入鎖定靜態變量
它會被許多線程併發地和頻繁地讀取。
我需要很少寫入(與讀取次數相比)。
確保threadsaftey的最好方法是什麼,以便在寫入它時,其他線程不會讀取部分寫入的數據?
我只用過lock
,但我知道這將防止併發讀取:(
感謝
我的C#ASP.NET項目中有一個靜態變量(抽象數據類型,不是原語)。在asp.net中讀取/寫入鎖定靜態變量
它會被許多線程併發地和頻繁地讀取。
我需要很少寫入(與讀取次數相比)。
確保threadsaftey的最好方法是什麼,以便在寫入它時,其他線程不會讀取部分寫入的數據?
我只用過lock
,但我知道這將防止併發讀取:(
感謝
我開始只是lock
無可爭議的鎖是很便宜你可能使用ReaderWriterLockSlim
(假設你使用.N。 ET 3.5),但鎖定更容易。如果/出現問題,請優化它。
直ReaderWriterLock
可能比簡單的鎖慢 - 這不是因爲快,因爲它可能會,因此瘦身版:)
究竟有多頻繁,你的「經常」呢?你期望多少爭用?您可能想要對其進行建模(例如,模擬合理數量的請求),並基準沒有鎖定與簡單鎖定,只是查看開銷是多少。
你可能能夠使用無鎖選項volatile
- 但坦率地說,我最近放棄了這一點,因爲理智的人理智太難了。 (這並不意味着我的意思。)
你究竟在做什麼數據?類型是不可變的類型,所以一旦你有正確的引用,你可以讀取一個線程安全的方式沒有任何鎖定?
可以使用ReaderWriterLock
,這是更困難比lock
使用,但它允許併發讀: http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlock.aspx
感謝您的幫助,我已經解決了這種方法,直到性能成爲問題。據推測,這是正確的(線程),其中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;
}
}
}
以下發布了我的解決方案是的,這很安全。使用一個易變的私有變量也可能會好起來。任何理由你使用一個屬性'res',因爲它是私人的? – 2009-09-04 14:03:19
感謝您的幫助:)沒有理由,將其刪除;) – 2009-09-04 14:47:00
好advice-這是,除非你瞭解它,你最終可能會做出錯誤的選擇了.NET框架怪事之一。 – RichardOD 2009-09-04 10:54:59
@ 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
感謝您的建議。我會閱讀每一個請求,所以頻繁出現流量。寫作將按照每天一次的順序進行。 – 2009-09-04 11:10:19