Spring Boot项目之synchronized处理并发

2021-06-23 02:05

阅读:539

标签:work   return   ble   str   结束   用户数   特价   app   单机   

在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")
@Slf4j
public 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
*/
@Service
public class SecKillServiceImpl implements SecKillService {

private static final int TIMEOUT = 10 * 1000; //超时时间 10s

@Autowired
private RedisLock redisLock;

/**
* 国庆活动,皮蛋粥特价,限量100000份
*/
static Map products;
static Map stock;
static Map 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);
}

//解锁

}
}

技术分享图片

 

Spring Boot项目之synchronized处理并发

标签:work   return   ble   str   结束   用户数   特价   app   单机   

原文地址:https://www.cnblogs.com/bozzzhdz/p/9675909.html


评论


亲,登录后才可以留言!