在orderProductMockDiffUser(String productId)方法体上加入synchronized关键字,可以保证每次都是单线程处理,因为加上了锁。但这种做法只适合单点操作,即单机上的做法,对于多机上来说的话是不合适的。
package com.imooc.controller; import com.imooc.service.SecKillService;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestController@RequestMapping("/skill")@Slf4jpublic class SecKillController { @Autowired private SecKillService secKillService; /** * 查询秒杀活动特价商品的信息 * @param productId * @return */ @GetMapping("/query/{productId}") public String query(@PathVariable String productId)throws Exception { return secKillService.querySecKillProductInfo(productId); } /** * 秒杀,没有抢到获得"哎呦喂,xxxxx",抢到了会返回剩余的库存量 * @param productId * @return * @throws Exception */ @GetMapping("/order/{productId}") public String skill(@PathVariable String productId)throws Exception { log.info("@skill request, productId:" + productId); secKillService.orderProductMockDiffUser(productId); return secKillService.querySecKillProductInfo(productId); }}
package com.imooc.service.impl; import com.imooc.exception.SellException;import com.imooc.service.RedisLock;import com.imooc.service.SecKillService;import com.imooc.utils.KeyUtil;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service; import java.util.HashMap;import java.util.Map; /** * Created by 廖师兄 * 2017-08-06 23:18 */@Servicepublic class SecKillServiceImpl implements SecKillService { private static final int TIMEOUT = 10 * 1000; //超时时间 10s @Autowired private RedisLock redisLock; /** * 国庆活动,皮蛋粥特价,限量100000份 */ static Map<String,Integer> products; static Map<String,Integer> stock; static Map<String,String> orders; static { /** * 模拟多个表,商品信息表,库存表,秒杀成功订单表 */ products = new HashMap<>(); stock = new HashMap<>(); orders = new HashMap<>(); products.put("123456", 100000); stock.put("123456", 100000); } private String queryMap(String productId) { return "国庆活动,皮蛋粥特价,限量份" + products.get(productId) +" 还剩:" + stock.get(productId)+" 份" +" 该商品成功下单用户数目:" + orders.size() +" 人" ; } @Override public String querySecKillProductInfo(String productId) { return this.queryMap(productId); } @Override public void orderProductMockDiffUser(String productId) { //加锁 //1.查询该商品库存,为0则活动结束。 int stockNum = stock.get(productId); if(stockNum == 0) { throw new SellException(100,"活动结束"); }else { //2.下单(模拟不同用户openid不同) orders.put(KeyUtil.genUniqueKey(),productId); //3.减库存 stockNum =stockNum-1; try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } stock.put(productId,stockNum); } //解锁 }}
原文地址:https://www.cnblogs.com/bozzzhdz/p/9675909.html
时间: 2024-11-02 09:15:22