首页 > 编程语言 > 详细

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

时间:2018-10-22 23:52:06      阅读:163      评论:0      收藏:0      [点我收藏+]

做活动,要发优惠券,规定一人只能领取一次(一张)。一天下来发现有一个客户领到了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()多次,记优惠券被多次领取

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!