码迷,mamicode.com
首页 > 编程语言 > 详细

springMVC的controller中insert()多次,记优惠券被多次领取

时间:2018-10-23 00:09:25      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:分享   size   参考   url   估计   cti   tom   sky   多次   

做活动,要发优惠券,规定一人只能领取一次(一张)。一天下来发现有一个客户领到了4张,且是同一秒生成的,源代码如下:

技术分享图片

 

估计多个线程同时进了add方法。

想到了单例的双重校验,现修改代码如下,

    public Object activityTicketAdd(String token,String activityName) {
        Customer customer = getCustomer(token) ;
        Ticket ticket = new Ticket();
        ticket.setCustomerId(customer.getId());
        ticket.setFrom(activityName);
        if(ticketsDao.queryList(ticket,null,null).size()<=0) {
            synchronized (this) {
                if (ticketsDao.queryList(ticket, null, null).size() <= 0) {
                    return ticketService.addTicket(customer, activityName);
                }
            }
        }
        return "REPEAT";
    }

 

参考(单例模式中的双重校验锁):https://www.cnblogs.com/diaoniwa/p/7299746.html

同时查看synchronized(this/class) 的区别:https://www.cnblogs.com/huansky/p/8869888.html

springMVC的controller中insert()多次,记优惠券被多次领取

标签:分享   size   参考   url   估计   cti   tom   sky   多次   

原文地址:https://www.cnblogs.com/mobaids/p/9833777.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!