【问题标题】:Locking to modify static value-type member. Is it necessary?锁定以修改静态值类型成员。有必要吗?
【发布时间】:2010-08-17 16:28:07
【问题描述】:

我有一个 CacheHelper 类来促进与缓存的交互。我想使用静态 int 字段来指定我的缓存超时。该字段最初设置为 const 默认值,但我想为应用程序提供一种更改默认超时值的方法。

修改静态值类型时需要加锁吗?设置器中的锁是否必要?您还可以在这里看到其他问题吗?抱歉,说到多线程,我还是很笨。

谢谢。

public static class CacheHelper
{
    private static object _SyncRoot;
    private static int _TimeoutInMinutes = CacheDefaults.TimeoutInMinutes; 

    public static int TimeoutInMinutes
    {
        get
        {
            return _TimeoutInMinutes;
        }
        set
        {
            lock (_SyncRoot)
            {
                if (_TimeoutInMinutes != value)
                {
                    _TimeoutInMinutes = value;
                }
            }
        }
    }

    public static void Insert(string key, Object data)
    {
        if (HttpContext.Current != null && data != null)
        {
            HttpContext.Current.Cache.Insert(key, data, null, Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(CacheHelper.TimeoutInMinutes));
        }
    }
}

【问题讨论】:

    标签: multithreading locking static-members


    【解决方案1】:

    您可以改用 volatile 变量...但您需要 一些东西,否则一个线程写入的值可能永远不会被另一个线程看到。

    请注意,对于诸如doublelong 之类的“较大”类型,您确实应该使用锁或Interlocked 类,因为对这些值的修改可能不是原子的。

    【讨论】:

    • 可以结合使用 volatile 和 lock 吗?超时值将被大量读取但很少写入(如果有的话,除了在 Global.asax 中的代码启动应用程序时)。
    • @whatispunk:嗯,它不会造成任何伤害......但它也不会有太大帮助。你为什么要同时使用这两个?对于int 的情况,Volatile 就足够了...
    • 感谢您的帮助。我只是想弄清楚所有这些意味着什么。关于 volatile 的使用似乎有不同的看法,我什至不理解它背后的大部分术语,即多个 CPU 和指令的顺序等。绝对需要一些时间来阅读多线程。
    【解决方案2】:

    如果 CacheHelper 的客户端做了类似的事情,你不需要在这里锁定

    CacheHelper.TimeoutInMinutes = input.Value; 
    

    因为它不依赖于先前的值。

    如果你的客户做了类似的事情

    CacheHelper.TimeoutInMinutes += input.Value; 
    

    然后你需要做一些锁定

    .

    【讨论】:

      猜你喜欢
      • 2012-05-01
      • 2017-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多