读/写锁定asp.net中的静态var

时间:2009-09-04 10:45:13

标签: c# asp.net multithreading

我的C#ASP.NET项目中有一个静态变量(抽象数据类型,而不是原始数据)。

许多线程会同时和频繁地读取它。

我需要很少写入(与读取次数相比)。

确保threadaftey的最佳方法是什么,以便在写入时,其他线程不会读取部分写入的数据?

我只使用过lock,但我知道这会阻止并发读取:(

由于

3 个答案:

答案 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;
        }
    }
}