锁与theadLocal的合并使用
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的合并使用的更多相关文章
- (转)SQL Server 中的事务和锁(三)-Range S-U,X-X 以及死锁
在上一篇中忘记了一个细节.Range T-K 到底代表了什么?Range T-K Lock 代表了在 SERIALIZABLE 隔离级别中,为了保护范围内的数据不被并发的事务影响而使用的一类锁模式(避 ...
- SQL Server 中的事务和锁(三)-Range S-U,X-X 以及死锁
在上一篇中忘记了一个细节.Range T-K 到底代表了什么?Range T-K Lock 代表了在 SERIALIZABLE 隔离级别中,为了保护范围内的数据不被并发的事务影响而使用的一类锁模式(避 ...
- 流式计算(一)-Java8Stream
大约各位看官君多少也听说了Storm/Spark/Flink,这些都是大数据流式处理框架.如果一条手机组装流水线上不同的人做不同的事,有的装电池,有的装屏幕,直到最后完成,这就是典型的流式处理.如果手 ...
- 【mysql】mysq8.0新特性
一.MySQL8.0简介 mysql8.0现在已经发布,2016-09-12第一个DM(development milestone)版本8.0.0发布.新的版本带来很多新功能和新特性,对性能也得到 ...
- Golang Sync.WaitGroup 使用及原理
Golang Sync.WaitGroup 使用及原理 使用 func main() { var wg sync.WaitGroup for i := 0; i < 10; i++ { wg.A ...
- [No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图
行结束符和空白选项 在项目的生命周期中,有时可能会将行结束符由 CRLF 改为 LF,或者修改一段代码的缩进.不幸的是这样将会使大量的代码行被标记为已修改,尽管代码本身并没有被修改.这里列出的选项将会 ...
- C++ 高性能无锁日志系统
服务器编程中,日志系统需要满足几个条件 .高效,日志系统不应占用太多资源 .简洁,为了一个简单的日志功能引入大量第三方代码未必值得 .线程安全,服务器中各个线程都能同时写出日志 .轮替,服务器不出故障 ...
- 如何创建一个简单的C++同步锁框架(译)
翻译自codeproject上面的一篇文章,题目是:如何创建一个简单的c++同步锁框架 目录 介绍 背景 临界区 & 互斥 & 信号 临界区 互斥 信号 更多信息 建立锁框架的目的 B ...
- lucene写索引出现锁文件的原因之一
lucene正常情况目录下的文件 有三个文件. segments.gen segments_a08, 还有一个类似 _uw.cfs名字的东西. 当然,不一定都一样, 但肯定是这三个. 如果出现了很多文 ...
随机推荐
- 动态布局中RadioGroup的RadioButton有时候不相互排斥的原因
近期在做一个答题类的模块,有单选.简答.调查问卷等,我是用动态布局的方式生成答题项的.在弄单选的时候遇到一个比較奇葩的问题,在代码中生成RadioGroup和RadioButton的时候.会发现不能相 ...
- [Done]SnowFlake 分布式环境下基于ZK构WorkId
Twitter 的 Snowflake 大家应该都熟悉的,先上个图: 时间戳 序列号一般不会去改造,主要是工作机器id,大家会进行相关改造,我厂对工作机器进行了如下改造(估计大家都差不多吧,囧~~~ ...
- python之函数用法xrange()
# -*- coding: utf-8 -*- #python 27 #xiaodeng #python之函数用法xrange() #xrange() #说明:返回一个生成器 #xrange做循环的性 ...
- JMeter入门:Java Request实例 (转)
转自:http://blog.csdn.net/czp11210/article/details/26174969 目的:对Java程序进行测试: 一.核心步骤 1.创建一个Java工程: 2 ...
- RabbitMQ消息队列生产者和消费者
概述 生产者生产数据至 RabbitMQ 队列,消费者消费 RabbitMQ 队列里的数据. 详细 代码下载:http://www.demodashi.com/demo/10723.html 一.准备 ...
- [Table] pm_result
', '20160501.17:30 - 20160501.17:45', '2.1', '3.1', '3.1', '3.11', '3.44', '12.30', null, null, null ...
- python 版websocket实现
ubuntu下python2.76 windows python 2.79, chrome37 firefox35通过 代码是在别人(cddn有人提问)基础上改的, 主要改动了parsedata和se ...
- docker登录没有配置https的harbor镜像仓库
已经搭建harbor 仓库 ,域名 172.16.1.99 出现问题: 客户端尝试登录 仓库 [root@localhost docker]# docker login 172.16.1.99:80 ...
- HDUOJ-----1066Last non-zero Digit in N!
Last non-zero Digit in N! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Jav ...
- 使用Android Ant在编译时混淆
关于ANT 编译和脚本请查看 : http://sinfrancis.javaeye.com/blog/721582 这里使用的是proguard4.4 ,在原有的ANT脚本上加入以下代码: 定义pr ...