题:高并发场景下秒杀项目静态锁的使用疑问
场景:我们有一个秒杀平台,可以提供所有接入公司创建的秒杀活动,简单描述如下:
1、秒杀10袋洗衣粉,开始时间12:00(项目ID:A001)
2、秒杀iPhone5,开始时间12:00(项目ID:A002)
3、秒杀水杯,开始时间12:00(项目ID:A003)
... ...(项目ID:A004-A009)
10、秒杀ThinkPad,开始时间12:00(项目ID:A010)
例如上面,同时有十个秒杀,都是12:00整开始,每个秒杀之间没有任何关系。
按照我之前的有限的非高并发场景经验,比较好处理,在一个方法中使用全局静态锁,保证库存扣减的安全性。
private static object myLock=new object();
public int MiaoShaFunc()
{
if(项目X库存>0)
{
lock锁住(myLock)
{
if(项目X库存>0)
{
//TODO:一系列扣减操作
}
}
}
}
但是,现在的问题是,当高并发场景下,每一个项目都可能有海量的用户在进行秒杀操作,而十个秒杀项目同时进行,当秒杀项目A001锁住myLock时,其他的A002-A010调用该方法的项目都会收到影响,从而导致大面积的等候。
请问,这种场景该怎么优化?是不是存在某种方案,可以按一定条件,只锁住一部分流量,例如A001项目的用一个锁,A002用另外一个锁这样的方案?
请高手赐教