package cn.com.do1.component.yopin.util;

import cn.com.do1.common.exception.BaseException;
import cn.com.do1.common.framebase.dqdp.IBaseDAO;
import cn.com.do1.component.ordermanage.order.model.Tb91OrderInfoPO;
import cn.com.do1.component.ordermanage.order.model.Tb91OrderItmPO;
import cn.com.do1.component.yopin.model.Tb91BeggingPO;

import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
* Created by ao.ouyang on 2015/8/3.
* //处理抢订单操作
*/
public class OrderSyncUtil {
private static OrderSyncUtil orderSyncUtil;
private final static Lock lock = new ReentrantLock(true);//公平锁
private final static ThreadLocal<Integer> execCount= new ThreadLocal<Integer>();//执行次数

public static OrderSyncUtil getInstance() throws Exception{
execCount.set(5); // 初始化执行次数
if(null == orderSyncUtil){
try {
lock.lock();;
orderSyncUtil = (cn.com.do1.component.yopin.util.OrderSyncUtil) Class.forName("cn.com.do1.component.yopin.util.OrderSyncUtil").newInstance();
}finally {
lock.unlock();
}
}
return orderSyncUtil;
}

public Tb91OrderItmPO gradOrder(IBaseDAO baseDAO,Map inputMap) throws Exception,BaseException{
Tb91OrderItmPO itmPO = null;
if(lock.tryLock(100, TimeUnit.MILLISECONDS)){
try {
itmPO = doGrad(baseDAO, inputMap);
}finally {
lock.unlock();
}
}else{
execCount.set(execCount.get()-1);
if(execCount.get() <= 0){
throw new Exception("指定时间内未获取到锁,请重试!");
}else{
itmPO = gradOrder(baseDAO, inputMap);
}
}
return itmPO;
}

public Tb91OrderInfoPO orderPayMent(IBaseDAO baseDAO,Map inputMap) throws Exception,BaseException{
Tb91OrderInfoPO infoPO = null;
if(lock.tryLock(100, TimeUnit.MILLISECONDS)){
try {
infoPO = doPayMent(baseDAO, inputMap);
}finally {
lock.unlock();
}
}else{
execCount.set(execCount.get()-1);
if(execCount.get() <= 0){
throw new Exception("指定时间内未获取到锁,请重试!");
}else{
infoPO = doPayMent(baseDAO, inputMap);
}
}
return infoPO;
}

private Tb91OrderInfoPO doPayMent(IBaseDAO baseDAO,Map inputMap) throws Exception,BaseException{
String orderCode = inputMap.get("orderCode").toString();
Integer amount = Integer.valueOf(inputMap.get("amount").toString());
HashMap paramMap = new HashMap();
paramMap.put("orderCode", orderCode);
Tb91OrderInfoPO infoPO =(Tb91OrderInfoPO) baseDAO.searchByField(Tb91OrderInfoPO.class, "select * from tb_91_order_info where ORDER_CODE=:orderCode and ORDER_STATUS in (0,2)", paramMap, true).get(0);
infoPO.setRemainAmount(infoPO.getRemainAmount()-amount);
baseDAO.update(infoPO,false);
Tb91BeggingPO beggingPO = new Tb91BeggingPO();
beggingPO.setId(UUID.randomUUID().toString());
beggingPO.setAmount(amount.floatValue());
beggingPO.setOrderCode(orderCode);
beggingPO.setGoodsDesc(infoPO.getGoodsDesc());
beggingPO.setBeggarUsrId(infoPO.getUsrId());
beggingPO.setCreateTime(new Date());
beggingPO.setGiverUsrId(inputMap.get("openid").toString());
beggingPO.setGiverUsrName(inputMap.get("nickname").toString());
beggingPO.setBeggarUsrName("");
baseDAO.insertData(beggingPO);
if(infoPO.getRemainAmount() <=0){
throw new Exception("订单已经筹满金额了!!!");
}
return infoPO;
}

private Tb91OrderItmPO doGrad(IBaseDAO baseDAO,Map inputMap)throws Exception,BaseException{
HashMap paramMap = new HashMap();
paramMap.put("orderCode",inputMap.get("orderCode"));
List<Tb91OrderItmPO> itmPOs =baseDAO.searchByField(Tb91OrderItmPO.class, "select * from tb_91_order_itm where ORDER_CODE =:orderCode", paramMap, true);
if(itmPOs.size()<=0){
throw new Exception("你来晚了。礼品已经被抢光了!!!。。");
}
for(Tb91OrderItmPO itmPO : itmPOs){
if(inputMap.get("openid").toString().equalsIgnoreCase(itmPO.getReceiverUstId())){
throw new Exception("你已经获取过礼品了!!!");
}
}
Tb91OrderItmPO itmPO = itmPOs.get(0);
String openid = inputMap.get("openid").toString();
String province = inputMap.get("province").toString();
String city = inputMap.get("city").toString();
String concatName= inputMap.get("concatName").toString();
String phone = inputMap.get("phone").toString();
String addr = inputMap.get("addr").toString();
itmPO.setProvince(province);
itmPO.setCity(city);
itmPO.setShipmentAddr(addr);
itmPO.setReceiverUstId(openid);
itmPO.setReceiverUserName(concatName);
itmPO.setMobilePhone(phone);
baseDAO.update(itmPO,false);
return itmPO;
}
}

锁与theadLocal的合并使用的更多相关文章

  1. (转)SQL Server 中的事务和锁(三)-Range S-U,X-X 以及死锁

    在上一篇中忘记了一个细节.Range T-K 到底代表了什么?Range T-K Lock 代表了在 SERIALIZABLE 隔离级别中,为了保护范围内的数据不被并发的事务影响而使用的一类锁模式(避 ...

  2. SQL Server 中的事务和锁(三)-Range S-U,X-X 以及死锁

    在上一篇中忘记了一个细节.Range T-K 到底代表了什么?Range T-K Lock 代表了在 SERIALIZABLE 隔离级别中,为了保护范围内的数据不被并发的事务影响而使用的一类锁模式(避 ...

  3. 流式计算(一)-Java8Stream

    大约各位看官君多少也听说了Storm/Spark/Flink,这些都是大数据流式处理框架.如果一条手机组装流水线上不同的人做不同的事,有的装电池,有的装屏幕,直到最后完成,这就是典型的流式处理.如果手 ...

  4. 【mysql】mysq8.0新特性

    一.MySQL8.0简介   mysql8.0现在已经发布,2016-09-12第一个DM(development milestone)版本8.0.0发布.新的版本带来很多新功能和新特性,对性能也得到 ...

  5. Golang Sync.WaitGroup 使用及原理

    Golang Sync.WaitGroup 使用及原理 使用 func main() { var wg sync.WaitGroup for i := 0; i < 10; i++ { wg.A ...

  6. [No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图

    行结束符和空白选项 在项目的生命周期中,有时可能会将行结束符由 CRLF 改为 LF,或者修改一段代码的缩进.不幸的是这样将会使大量的代码行被标记为已修改,尽管代码本身并没有被修改.这里列出的选项将会 ...

  7. C++ 高性能无锁日志系统

    服务器编程中,日志系统需要满足几个条件 .高效,日志系统不应占用太多资源 .简洁,为了一个简单的日志功能引入大量第三方代码未必值得 .线程安全,服务器中各个线程都能同时写出日志 .轮替,服务器不出故障 ...

  8. 如何创建一个简单的C++同步锁框架(译)

    翻译自codeproject上面的一篇文章,题目是:如何创建一个简单的c++同步锁框架 目录 介绍 背景 临界区 & 互斥 & 信号 临界区 互斥 信号 更多信息 建立锁框架的目的 B ...

  9. lucene写索引出现锁文件的原因之一

    lucene正常情况目录下的文件 有三个文件. segments.gen segments_a08, 还有一个类似 _uw.cfs名字的东西. 当然,不一定都一样, 但肯定是这三个. 如果出现了很多文 ...

随机推荐

  1. oracle 建表时显示ORA-00904无效的标识符

      oracle 建表时显示ORA-00904无效的标识符 CreationTime--2018年7月19日16点03分 Author:Marydon 1.情景展示 使用plsql建表时,报错 字段展 ...

  2. webservice系统学习笔记7-异常处理

    接口类:IMyService.java @WebResult(name="testExceptionResult") public void testException() thr ...

  3. DIV+CSS专题:十天学会DIV+CSS

    DIV+CSS专题:十天学会DIV+CSS,在网上看到的.感觉蛮好,推荐一下. 十天学会DIV+CSS(WEB标准)CHM格式文件下载 第十天 div+css网页标准布局实例教程(三) 第十天 div ...

  4. BIND9源码分析之acl 的实现

    BIND配置中一大堆一大堆的acl,什么allow-query, allow-recursion, allow-update还有view的match-clients等等等等. acl中的主要存储的就是 ...

  5. 【LeetCode】24. Swap Nodes in Pairs (3 solutions)

    Swap Nodes in Pairs Given a linked list, swap every two adjacent nodes and return its head. For exam ...

  6. bookstrap table插件

    牛逼的插件: http://www.html580.com/?oF9uwUtZ

  7. oc 异常处理

    #import <UIKit/UIKit.h> #import "AppDelegate.h" int main(int argc, char * argv[]) { ...

  8. Hspice仿真打印某个子模块中所有信号信息

    简单的说就是在你要打印的子模块中加一句:.probe v(*) i(*)就可以了,这个子模块的每一个实例都会被打印出来.

  9. Mac 开发者设置强迫症

    Latest commit 2461787 on Mar 1 原文链接 强迫症的 Mac 设置指南 如何配置一个高效的 Mac 工作环境 English Version Table of Conten ...

  10. ps抠图简单方法

    选中对象后保存对象到新的图层方法.ctrl+c,ctrl+v即可 1 使用魔术棒 适用范围:图像和背景色色差明显,背景色单一,图像边界清晰. 方法意图:通过删除背景色来获取图像. 方法缺陷:对散乱的毛 ...