当高并发情况下,
10万次的抽奖场景下,
共抽奖142606次 ,
统计汇信T恤,初始化5w件 ,
数据库统计,获奖记录中奖品为汇信T恤的有4190条记录
后台剩余数量为46136件 大于5w。
在抽奖方法内部,针对数据库奖品库存操作和抽奖时对数据库的操作等抽奖行为 作为一个代码块,加上同步锁。
http://blog.csdn.net/yangzhijun_cau/article/details/6432216
- 任何代码片段、设置或对话框的截屏,只要它们是解决方案的一部分,或者可以帮助更深入地理解相关细节
添加同步锁方式(详见代码):
private static String lock="lock";
public LotteryResultInfo doDrawLottery(BigDecimal userId, String activityId) {
LotteryResultInfo lotteryResultInfo=new LotteryResultInfo();
LollterActivity lollterActivity=null;
List<PrizeTypeConfig> prizeTypeConfigList=null;
Map<String ,Object> qryMap=new HashMap<String, Object>();
qryMap.put("activityId",activityId);
LotteryResultInfo lotteryResultInfo1=null;
synchronized(lock){
try{
lollterActivity=lollterActivityService.doGetById(activityId);
prizeTypeConfigList=prizeTypeConfigService.doGetList(qryMap);
//验证抽奖活动
Validator validator=validateActivity(activityId, lollterActivity, prizeTypeConfigList);
if(validator.getValidteCode()!=1){
lotteryResultInfo.setResultCode(validator.getValidteCode()+"");
lotteryResultInfo.setMsg(validator.getValidateMsg());
return lotteryResultInfo;
}
}catch(Exception e){
lotteryResultInfo.setResultCode("500");
lotteryResultInfo.setMsg("抽奖发生异常!");
return lotteryResultInfo;
}
lotteryResultInfo1=doDrawLottery(userId, lollterActivity, prizeTypeConfigList);//抽奖
}
return lotteryResultInfo1;
}
1、声明静态变量(类变量)
2、为需要加锁的代码块加同步锁,锁对象为第一步的静态变量。
synchroized 锁 同步 多线程同步 数据实时性