Spring Boot项目之synchronized处理并发

在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

Spring Boot项目之synchronized处理并发的相关文章

笔记:Spring Boot 项目构建与解析

构建 Maven 项目 通过官方的 Spring Initializr 工具来产生基础项目,访问 http://start.spring.io/ ,如下图所示,该页面提供了以Maven构建Spring Boot 项目的功能. 选择构建工具 Maven Project,Spring Boot 版本选择 1.5.4,填写 Group 和 Artifact 信息,在Search for dependencies 中可以搜索需要的其他依赖包,这里我们需要实现 RESTful API,所以可以添加 Web

Spring Boot项目搭建

1.Spring Boot概述 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.总所周知,Spring平台饱受非议的一点就是大量的XML配置以及复杂的依赖管理,而Spring Boot的出现就是用来简化操作的.相比传统的Spring,项目搭建更简单.方便.快速. 2.项目搭建 本文采用IDEA搭建Spring Boot,Demo结构图如下: 通过ID

[读书笔记] 一、Spring boot项目搭建与配置文件

读书笔记:[JavaEE开发的颠覆者 Spring Boot实战] 作者:汪云飞 从今天开始坚持读书,并记录下此读书笔记. 一,初接触 Spring boot 项目Hello world搭建 1.pom.xml 配置如下: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocat

Eclipse中创建新的Spring Boot项目

简单几步,在Eclipse中创建一个新的Spring Boot项目: 1.Eclipse中安装STS插件: Help -> Eclipse Marketplace... Search或选择"Popular"标签,选择Spring Tool Suite (STS) for Eclipse插件,安装: 2.New -> Project... 找到Spring目录,选择Spring Starter Project,Next 3.填写跟项目相关的各种信息,然后Next: 4.选择需

Spring boot 1: 使用IDEA创建Spring boot项目

项目用到的环境: Windows 10 JDK8 IntelliJ IDEA 2017.1.3 Apache Tomcat 8 Maven 3.3.3 使用IDEA新建spring boot项目 新建项目 选择类型为Spring Initializer. 填入相关的项目信息 选择denpendcy 接着下一步, 选择web. 选择路径 再下一步, 选择项目的路径, 点击完成 新建成的项目的文件目录结构如下图: 第一个Spring boot项目 pom.xml如下所示: <dependencies

Spring Boot项目部署到 IBM WebSphere 8.5.5需要注意的地方

遇到问题 对Spring Boot观察了好久,最近终于开始有机会使用Spring Boot来做项目的开发,Spring Boot不需要部署,用jar包模式运行的机制,非常适合做快速开发,能在项目演示和迭代期间起到快速的推进作用.整体来说是一个非常好快速开发框架. 今天着重要说一下的是Spring Boot项目打包成war包,部署到J2EE容器,特别是Websphere遇到的问题. 首先Spring Boot项目build的war包,在Tomcat 7,8,Jetty等容器下,不论是嵌入到ecli

spring boot项目如何测试,如何部署

有很多网友会时不时的问我,spring boot项目如何测试,如何部署,在生产中有什么好的部署方案吗?这篇文章就来介绍一下spring boot 如何开发.调试.打包到最后的投产上线. 开发阶段 单元测试 在开发阶段的时候最重要的是单元测试了,springboot对单元测试的支持已经很完善了. 1.在pom包中添加spring-boot-starter-test包引用 <dependency> <groupId>org.springframework.boot</groupI

Spring Boot项目打包方式为war

spring boot项目默认是使用内嵌的tomcat打包为jar的方式,我们可以进行一些修改让其打包方式为war包: 修改maven的pom.xml <packaging>war</packaging> 然后将内嵌的tomcat依赖修改为: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web-tomc

spring boot项目起步(一)

一.eclipse中创建spring boot项目 访问https://start.spring.io/,填入Group,Artifact,以及依赖的库,本次仅加入web的依赖(即springMVC的依赖),如图: 点击生成项目后下载解压. eclipse中导入生成的spring boot项目,File-Import-Maven-Existing Maven Projects-选择解压的项目-导入到eclipse中完成. 右键项目,run as maven build,goal为package,