Блокировка для изменения статического члена типа значения. Это необходимо? - PullRequest
1 голос
/ 17 августа 2010

У меня есть класс CacheHelper для облегчения взаимодействия с кешем. Я хочу использовать статическое поле int, чтобы указать тайм-аут моего кэша. Поле изначально имеет постоянное значение по умолчанию, но я хочу предоставить приложению способ изменить значение тайм-аута по умолчанию.

Нужно ли блокировать при изменении типа статического значения? Нужна ли блокировка в сеттере? Есть ли другие проблемы, которые вы можете увидеть здесь? Извините, я все еще довольно глуп, когда дело доходит до многопоточности.

Спасибо.

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));
        }
    }
}

Ответы [ 2 ]

2 голосов
/ 17 августа 2010

Вместо этого вы можете использовать переменную volatile ... но вам нужно что-то , в противном случае возможно, что значение, записанное одним потоком, никогда не будет замечено другим.

Обратите внимание, что для "больших" типов, таких как double или long, вы действительно должны использовать блокировку или класс Interlocked, поскольку модификации этих значений могут быть не атомарными.

0 голосов
/ 17 августа 2010

Вам не нужно блокировать здесь, если клиент CacheHelper делает что-то вроде

CacheHelper.TimeoutInMinutes = input.Value; 

Так как он не полагается на предыдущее значение.

Если ваш клиент что-то делаеткак

CacheHelper.TimeoutInMinutes += input.Value; 

Тогда вам нужно будет выполнить некоторую блокировку

.

...