锁与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名字的东西. 当然,不一定都一样, 但肯定是这三个. 如果出现了很多文 ...
随机推荐
- 微软 Visual Studio 2017 中文正式版下载 – 免费社区版/专业版/企业版
作为“宇宙最强”的集成开发环境 IDE,微软的 Visual Studio 不仅破天荒发布了 macOS 版本,如今终于也推出了其 Windows 的最新版本—— VS 2017 正式版了.这对开发者 ...
- 使用Nginx限制同一IP的访问频率
http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html http://nginx.org/en/docs/http/ngx_http ...
- 2016年度GitHub上Stars最多的10个项目
来源于:https://zhuanlan.zhihu.com/p/24627923 2016年接近尾声,在最近的几篇文章中,会整理总结一些2016年度开源项目.今天整理的是:2016年度GitHub最 ...
- 关于PHP中的opcode
简介 1.当Zend engine解释器完成对脚本代码的分析后,便将它们生成可以直接运行的中间代码,也称为操作码(Operate Code,opcode),opcode是一个四元组,(opcode, ...
- MongoDB-开始学习MongoDB(一)
先来看看MongoDB的优缺点: 优点:简单的扩展.快速的读写.灵活的数据类型 缺点:不支持对SQL的支持.支持的特性不够丰富.现有产品不够成熟 应用场景: 适用场景: 持久化缓存层.实时的高效性(读 ...
- Dell笔记本Ubuntu无线网卡驱动安装
[日期:2010-06-09] 经过长时间学习Ubuntu无线网卡,,你可能会遇到Ubuntu无线网卡问题,,这里将介绍Ubuntu无线网卡问题的解决方法整了一晚上,终于在我的dell 1440上 ...
- SpringBoot自定义HttpMessageConverter
Spring就是一个大大的插线板,上面插着各种各样的Bean. SpringBoot大大简化了Spring的配置,将原来放在XML中的配置大量的在代码中使用注解实现.这么做有利有弊,总体上利大于弊. ...
- 使用git 将自己的本地文件git到github上面的完整过程
1. 首先在github网站上新建一个仓库,复制仓库地址(HTTP形式或者SSH形式,后者利用SSH,在最后一步push 的时候可以不用输入用户名和密码). 2. 在本地某个你想要的(文件夹)目录 ...
- 通过iscsi协议使用ceph rbd
转自:http://blog.csdn.net/wytdahu/article/details/46545235 ceph很早就已经支持通过iscsi协议来使用rbd,这篇博文对此做下演示,并且使用O ...
- 介绍一款chrom浏览器插件 DHC是一款使用chrome模拟REST客户端向服务器发送测试数据的谷歌浏览器插件
先打个小广告哈 公司招java架构师,月薪25K以上,负责电商平台架构工作,工作地点在北京 1号线永安里站 附近,如有意向 请把简历发我邮箱jia6235@163.com 可以内部推荐. DHC是一款 ...