我的C#ASP.NET项目中有一个静态变量(抽象数据类型,而不是原始数据)。
许多线程会同时和频繁地读取它。
我需要很少写入(与读取次数相比)。
确保threadaftey的最佳方法是什么,以便在写入时,其他线程不会读取部分写入的数据?
我只使用过lock
,但我知道这会阻止并发读取:(
由于
答案 0 :(得分:6)
我从lock
开始。无可争议的锁非常便宜。您可以使用ReaderWriterLockSlim
(假设您使用的是.NET 3.5),但锁定更容易实现。如果/当它成为问题时优化它。
直的ReaderWriterLock
可能比简单的锁慢 - 它没有它可能的那么快,因此超薄版本:)
你经常“频繁”的频率是多少?您期望多少争用?您可能希望对其进行建模(例如,模拟合理数量的请求)并基准测试无锁定与简单锁定,只是为了查看开销是什么。
你可能能够使用volatile
的无锁选项 - 但坦率地说,我最近放弃了这一点,因为对于理智的人来说太难以理解。 (这并不意味着我的意思。)
您对数据的实际操作是什么?类型是不可变类型,所以一旦你有了正确的引用,你就可以在没有任何锁定的情况下以线程安全的方式阅读吗?
答案 1 :(得分:1)
您可以使用比ReaderWriterLock
更难使用的lock
,但它允许并发读取:
http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlock.aspx
答案 2 :(得分: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;
}
}
}