我有一个CacheHelper类来促进与缓存的交互。我想使用静态int字段来指定缓存超时。该字段最初设置为常量默认值,但我希望为应用程序提供一种更改默认超时值的方法。
修改静态值类型需要加锁吗?setter中的锁是必要的吗?您在这里还能看到其他问题吗?对不起,当涉及到多线程时,我仍然很愚蠢。
谢谢。
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));
}
}
}发布于 2010-08-18 00:37:43
您可以使用易失性变量来代替...但是你需要一些东西,否则一个线程写的值可能永远不会被另一个线程看到。
请注意,对于“较大”的类型,如double或long,您确实应该使用锁或Interlocked类,因为对这些值的修改可能不是原子的。
发布于 2010-08-18 00:42:25
如果CacheHelper的客户端做了一些事情,你不需要在这里锁定
CacheHelper.TimeoutInMinutes = input.Value; 因为它不依赖于先前的值。
如果你的客户做了这样的事情
CacheHelper.TimeoutInMinutes += input.Value; 然后,您需要执行一些锁定操作
。
https://stackoverflow.com/questions/3504719
复制相似问题