1. 程式人生 > >高並發場景下秒殺項目靜態鎖的使用疑問

高並發場景下秒殺項目靜態鎖的使用疑問

pad 請問 描述 系列 全局 obj 導致 操作 sta

題:高並發場景下秒殺項目靜態鎖的使用疑問
場景:我們有一個秒殺平臺,可以提供所有接入公司創建的秒殺活動,簡單描述如下:
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用另外一個鎖這樣的方案?

請高手賜教

高並發場景下秒殺項目靜態鎖的使用疑問