关于同步锁的一个问题

  • 问题发生日期
          2015-03-20
  • 问题简述
当高并发情况下,
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 锁 同步 多线程同步 数据实时性



jsf和jpa 期末大作业 <%@ page language="java" import="java.util.*,dao.*,entitybean.*" pageEncoding="utf-8"%> <%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%> <%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <f:view> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> <style type="text/css"> </style> </head> <body > <div style="position:absolute; width:100%; height:100%; z-index:-1;background-color:#2894FF;background-repeat : no-repeat;background-size:90% 90%;opacity:1"> <img src="image/re2.jpg"> <h3>人事信息管理</h3> <p style="text-align:center"> <h:outputLink value="/faces/add.jsp">添加一条</h:outputLink> <h:form> <h:dataTable value="#{loginBean.persons}" var="person" border="5" cellpadding="5" cellspacing="2"> <h:column> <f:facet name="header"> <h:outputText id="headerText1" value="职工号"/> </f:facet> <h:outputText value="#{person.id}"/> </h:column> <h:column> <f:facet name="header"> <h:outputText id="headerText2" value="姓名"/> </f:facet> <h:outputText value="#{person.name}"/> </h:column> <h:column> <f:facet name="header"> <h:outputText id="headerText3" value="性别"/> </f:facet> <h:outputText value="#{person.gender}"/> </h:column> <h:column> <f:facet name="header"> <h:outputText id="headerText4" value="年龄"/> </f:facet> <h:outputText value="#{person.age}"/> </h:column> <h:column> <f:facet name="header"> <h:outputText id="headerText5" value="国籍"/> </f:facet> <h:outputText value="#{person.address_country}"/> </h:column> <h:column> <f:facet name="header"> <h:outputText id="headerText6" value="详细地址"/> </f:facet> <h:outputText value="#{person.address_detail}"/> </h:column> <h:column> <f:facet name="header"> <h:outputText id="headerText7" value="邮编"/> </f:facet> <h:outputText value="#{person.address_zip}"/> </h:column> <h:column> <f:facet name="header"> <h:outputText id="headerText8" value="入职时间"/> </f:facet> <h:outputText value="#{person.entry_time}"/> </h:column> <h:column> <f:facet name="header"> <h:outputText id="headerText9" value="所属部门"/> </f:facet> <h:outputText value="#{person.depertment}"/> </h:column> <h:column> <f:facet name="header"> <h:outputText id="headerText10" value="职位"/> </f:facet> <h:outputText value="#{person.position}"/> </h:column> <h:column> <f:facet name="header"> <h:outputText id="headerText11" value="工资"/> </f:facet> <h:outputText value="#{person.salary}"/> </h:column> <h:column> <h:outputLink value="faces/edit.jsp" > <h:outputText value="编辑"></h:outputText> <f:param name="p_id" value="#{person.id}"/> </h:outputLink> </h:column> <h:column> <h:outputLink value="delete.jsp" > <h:outputText value="删除"></h:outputText> <f:param name="p_id" value="#{person.id}"/> </h:outputLink> </h:column> </h:dataTable> </h:form> </p> <img src="image/re.jpg"> </div> </body> </html> </f:view>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值