Блокировка для изменения статического элемента типа значения. Это необходимо?

У меня есть класс 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));
        }
    }
}
1
задан mikesigs 17 August 2010 в 16:28
поделиться

2 ответа

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

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

2
ответ дан 2 September 2019 в 22:05
поделиться

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

CacheHelper.TimeoutInMinutes = input.Value; 

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

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

CacheHelper.TimeoutInMinutes += input.Value; 

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

.

0
ответ дан 2 September 2019 в 22:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: