【发布时间】:2011-04-28 14:49:02
【问题描述】:
我有一个基于网络的商品订购系统。
- 商品的时间非常有限,仅售 Y 小时
- 每件商品只允许 X 次订单
为了保持每件商品的订单
private static Dictionary<Guid, Object> PurchaseLockDictionary = null;
private static object GetLock(Guid itemId)
{
if (!PurchaseLockDictionary.ContainsKey(itemId))
{
PurchaseLockDictionary.Add(itemId, new object());
}
return PurchaseLockDictionary[itemId];
}
购买看起来像这样:
public static Order Purchase(Buyer buyer, OrderItem item)
{
Order order;
try
{
lock (GetLock(item.Id))
{
// order stuff like counting current amount of orders, buyer validity etc
}
} catch (Exception e) {
// Exception stuff
}
return order;
}
现在,我的问题是,如何防止我的锁定机制(Dictionary 对象)不按比例增长?目前我们出于其他原因每周重新启动服务器,但我不希望代码依赖这种行为。
还有其他更适合这种锁定机制的数据结构吗?或者有没有一种智能的方法来查找和清理字典中的旧条目?非常欢迎提出想法!
【问题讨论】:
-
如果这段代码是从多个线程调用的(如果不是,则根本不需要任何锁),那么您需要围绕字典本身设置某种大的全局锁。如果没有,那么当多个线程点击
ContainsKey、Add、索引器等时,您将面临竞争条件的风险,甚至损坏您的字典。 -
听起来您想使用缓存解决方案,该解决方案将使不经常使用/访问的项目过期。如果是这样,那么您应该看看 System.Runtime.Caching msdn.microsoft.com/en-us/library/system.runtime.caching.aspx
-
您是重复使用您添加到字典中的对象来计算订购商品的数量还是仅将其用作锁?
-
@LukeH :多线程,是的,基于网络。 @fantasticfix:只是为了加锁,在锁内进行计数。
标签: c# data-structures locking memory-management race-condition