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. Android反编工具的使用-Android Killer

    今天百度搜索"Android反编译"搜索出来的结果大多数都是比較传统的教程.刚接触反编译的时候,我也是从这些教程慢慢学起的.在后来的学习过程中,我接触到比較方便操作的Android ...

  2. Web服务器性能压力测试工具http_load、webbench、ab、Siege使用教程

    Web服务器性能压力测试工具http_load.webbench.ab.Siege使用教程 作者: feng 日期: 2012/07/25 发表评论 (0) 查看评论   一.http_load 程序 ...

  3. Yum源的优先级

    yum源自定义优先级,提高下载速速! 01.Install Yum Priorities Run the Yum Priorities install commandyum install yum-p ...

  4. iOS- 快速实现展示布局

    概述 比较有规律的页面, 快速实现展示布局, 提高开发效率. 详细 代码下载:http://www.demodashi.com/demo/10713.html 看到这个界面,是不是觉得不像那种比较有规 ...

  5. Android API之android.provider.ContactsContract

    android.provider.ContactsContract ContactsContract是联系人provider和app的contract.定义了已支持的URL和column.取代了之前的 ...

  6. HDUOJ--点球大战

    点球大战 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  7. Java优化技巧

    过早的优化是万恶之源. 优化了的代码可读性变差,可改性可适应性变差,可维护性变差. 远离过度优化,优化是个无底洞,把主要精力放在代码逻辑上. 优化的代码是活在当下的,是严重依赖硬件的,不利于表达永恒的 ...

  8. 验证码在后台的编写,并实现点击验证码图片时时发生更新 C# 项目发布到IIS后不能用log4net写日志

    验证码在后台的编写,并实现点击验证码图片时时发生更新   验证码在软件中的地位越来越重要,有效防止这种问题对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试:下面就是实现验证码的基本步骤: ...

  9. shell 提取mysql指定数据库下表创建语句为单文件

    dbcn="mysql -h172.16.1.194 -uroot -p123456"; db=dsp_ad_center; ii=0; ct=`$dbcn -N -e " ...

  10. 【驱动笔记11】使用DeviceIoControl通信

    文章作者:grayfox作者主页:http://nokyo.blogbus.com原始出处:http://www.blogbus.com/nokyo-logs/34018521.html 在我昨日发布 ...