//controller里面使用锁

ActivityRedPacket ap = customerService.getActivityRedPacket(params);
     if (synchronizedUtil.lockActivyId.containsKey(ap.getId())) {//MAP(key)锁里面是否存在锁
        logger.info("<----------------领取红包客户:" + customeid + "多次操作领取红包!---------------------->");
        return;
     } else {
        synchronizedUtil.synchronizedActivyId(ap.getId());/添加锁
     }

  synchronized (synchronizedUtil.lockActivyId.get(ap.getId())) {//获取锁

    try{

            //逻辑

    }finally{

      synchronizedUtil.lockActivyId.remove(ap.getId());//释放锁(移除MAP KEY 值)

    }

  }

//synchronizedUtil工具类

public class synchronizedUtil {

  public static final ConcurrentHashMap<Integer, Object> lockVehicle = new ConcurrentHashMap<Integer, Object>();

   public static final ConcurrentHashMap<Integer, Object> lockOrder = new ConcurrentHashMap<Integer, Object>();

public static final ConcurrentHashMap<Integer, Object> lockCustomerId = new ConcurrentHashMap<Integer, Object>();

public static final ConcurrentHashMap<Integer, Object> lockActivyId = new ConcurrentHashMap<Integer, Object>();

public static synchronized void synchronizedVehicle(Integer vehicleId){

if (!lockVehicle.containsKey(vehicleId)) {

lockVehicle.put(vehicleId, new Object());

return;

}

}

public static synchronized void synchronizedOrder(Integer OrderId){

if (!lockOrder.containsKey(OrderId)) {

lockOrder.put(OrderId, new Object());

return;

}

}

public static synchronized void synchronizedCustomerId(Integer CustomerId){

if (!lockCustomerId.containsKey(CustomerId)) {

lockCustomerId.put(CustomerId, new Object());

return;

}

}

public static synchronized void synchronizedActivyId(Integer ActivyId){

if (!lockActivyId.containsKey(ActivyId)) {//是否包含此ID锁不包含则放到MAP里

lockActivyId.put(ActivyId, new Object());

return;

}

}

}

防止多次领取红包进行ID锁的更多相关文章

  1. MySQL->>innodb_autoinc_lock_mode参数控制auto_increment 插入数据时相关锁的模式

    转自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/15498/viewspace-2141640/ ---------------------------------- ...

  2. db事务级别及锁

    相关sql 事务A BEGIN TRANSACTION --执行修改 获取排他锁 UPDATE Product SET Price = 10 WHERE Id = 1 --阶段2 UPDATE Pro ...

  3. MySQL自增锁模式innodb_autoinc_lock_mode参数理解调优

    前段时间某数据表运行过程中,出现自增字段突然跳跃式增长的问题,潜心研究发现,问题导致原因可能是因为并发写入导致 于是通过各种途径查阅是因为innodb_autoinc_lock_mode参数设置的不同 ...

  4. SpringBoot基于数据库实现简单的分布式锁

    本文介绍SpringBoot基于数据库实现简单的分布式锁. 1.简介 分布式锁的方式有很多种,通常方案有: 基于mysql数据库 基于redis 基于ZooKeeper 网上的实现方式有很多,本文主要 ...

  5. 分布式锁实现(一):Redis

    前言 单机环境下我们可以通过JAVA的Synchronized和Lock来实现进程内部的锁,但是随着分布式应用和集群环境的出现,系统资源的竞争从单进程多线程的竞争变成了多进程的竞争,这时候就需要分布式 ...

  6. 30分钟全面解析-SQL事务+隔离级别+阻塞+死锁

    以前总是追求新东西,发现基础才是最重要的,今年主要的目标是精通SQL查询和SQL性能优化.  本系列主要是针对T-SQL的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础] ...

  7. iPhone 丢失

    http://www.appvv.com/zhuanti/iccid/ 第一步:iPhone丢失后,及时报警,在最短时间内补办SIM卡或把卡停掉. 第二步:输入查询网址:sn.appvv.com 输入 ...

  8. mysql 案例 ~ 常见案例汇总

    一 简介:这里汇总了一些mysql常见的问题二 案例场景   问题1 mysql设置了默认慢日志记录1S,为何会记录不超过1S的sql语句   答案 mysql~log_queries_not_usi ...

  9. 买二手iphone的建议

    手机到手后一定要在第一时间把“按键开关.指纹解锁.指南针.照相机.话筒.听筒.手电筒.定位.WiFi”都测一遍. 环境有无wifi:imei:×××××序列号:××××× 外观和零件:1外观,1是否粗 ...

随机推荐

  1. 牛客网程序员面试金典:1.2——原串翻转(java实现)

    问题描述: 请实现一个算法,在不使用额外数据结构和储存空间的情况下,翻转一个给定的字符串(可以使用单个过程变量). 给定一个string iniString,请返回一个string,为翻转后的字符串. ...

  2. @override的意思

    @Override是Java5的元数据,自动加上去的一个标志,告诉你说下面这个方法是从父类/接口 继承过来的,需要你重写一次,这样就可以方便你阅读,也不怕会忘记 @Override是伪代码,表示重写( ...

  3. oracle基础语法大全

    -----创建序列create sequence book_idINCREMENT BY 1 -- 每次加几个 START WITH 001 -- 从1开始计数 NOMAXVALUE -- 不设置最大 ...

  4. 在requirejs中使用qunit

    requirejs(['QUnit'], function(qunit) { qunit.test('test name', function(assert) { // 一些测试, assert }) ...

  5. PCI Express(五) - Xilinx wizard

    原文地址:http://www.fpga4fun.com/PCI-Express5.html Xilinx makes using PCI express easy - they provide a ...

  6. 如何优雅的实现INotifyPropertyChanged接口

    INotifyPropertyChanged接口在WPF或WinFrom程序中使用还是经常用到,常用于通知界面属性变更.标准写法如下: class NotifyObject : INotifyProp ...

  7. ASP.NET Misconfiguration: Excessive Session Timeout

    Abstract: An overly long authentication timeout gives attackers more time to potentially compromise ...

  8. Nginx内置变量以及日志格式变量参数详解

    $args #请求中的参数值 $query_string #同 $args $arg_NAME #GET请求中NAME的值 $is_args #如果请求中有参数,值为"?",否则为 ...

  9. SQL Server 常用命令使用方法

    (1) 数据记录筛选: sql="select * from 数据表 where 字段名=字段值 order by 字段名 [desc]" sql="select * f ...

  10. php+mysql

    本文整理一下使用php和mysql向前端推送数据的过程. 数据库部分: 1.首先安装服务器,我选择xampp,安装可以选择任意地址.安装完成,打开xampp-control.exe . 选择开启Apa ...