У меня есть класс 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));
}
}
}
Вместо этого вы можете использовать изменчивую переменную ... но вам нужно что-то , иначе возможно, что значение, записанное одним потоком, никогда не будет видно другим.
Обратите внимание, что для «больших» типов, таких как double
или long
, вы действительно должны использовать блокировку или класс Interlocked
, поскольку модификации этих значений не могут быть атомарными.
Вам не нужно блокировать здесь, если клиент CacheHelper делает что-то вроде
CacheHelper.TimeoutInMinutes = input.Value;
, поскольку он не полагается на предыдущее значение.
Если ваш клиент делает что-то вроде
CacheHelper.TimeoutInMinutes += input.Value;
, тогда вам необходимо выполнить некоторую блокировку
.