springMVC的controller中insert()多次,記優惠券被多次領取
阿新 • • 發佈:2018-10-23
校驗 syn https gmv list spring 源代碼 null tro
做活動,要發優惠券,規定一人只能領取一次(一張)。一天下來發現有一個客戶領到了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()多次,記優惠券被多次領取