乐观锁是一种思想,本身代码里并没有lock或synchronized关键字进行修饰。而是采用一种version。

即先从数据库中查询一条记录得到version值,在更新这条记录时在where条件中对这个version进行判断是否发生了变化。

若version值不变则更新这条数据。若前后两个version值不等则不更新,继续下一次循环。这样就确保了在同一时间只有一个线程来修改这个值

如下只要updateCount=0则继续循环取值。

try {
//启动CAS乐观锁
do {
BmRiderInterestingNews news = bmRiderInterestingNewsDao.getInterestingNewsByNewsId(interestingNewsId);
if (news == null) {
return -2;//对象为空
} /*
进行审核结果校验:
INIT(0), //疑似,机器不通过
MACHINE_PASS(1), //机器通过
MANUAL_PASS(2), //人工通过
MANUAL_DELETE(3), //人工删除
备注:如果是机器通过,返回的是“人工通过”,如果是“疑似”,会进入审核后台进行人工审核。
*/
int auditStatus = 0;//1审核通过 2审核不通过 //审核通过
if (verifyStatus == 1 || verifyStatus == 2) {
auditStatus = 1;
}
//审核不通过
if (verifyStatus == 3) {
auditStatus = 2;
} if (verifyStatus == 0) {
return 0;//疑似通过需要进一步等待
}
if (auditStatus == 0) {
return 1;//数据错误
} // 文字审核
if (type == 0) {
//文字审核驳回
if (auditStatus == 2) {
updateCount = bmRiderInterestingNewsDao.updateTextAudit(interestingNewsId, 2, auditStatus, news.getVersion(), 0);
}
//文字审核通过
else {
//图片审核通过
if (news.getImage_audit_status() == 1) {
updateCount = bmRiderInterestingNewsDao.updateTextAudit(interestingNewsId, 1, auditStatus, news.getVersion(), DateUtil.unixTime());
}
//图片待审核
else if (news.getImage_audit_status() == 0) {
updateCount = bmRiderInterestingNewsDao.updateTextAudit(interestingNewsId, 0, auditStatus, news.getVersion(), 0);
}
//图片驳回
else {
updateCount = bmRiderInterestingNewsDao.updateTextAudit(interestingNewsId, 2, auditStatus, news.getVersion(), 0);
}
}
}
//图片审核
else {
//图片审核被驳回
if (auditStatus == 2) {
updateCount = bmRiderInterestingNewsDao.updateImageAudit(interestingNewsId, 2, auditStatus, news.getVersion(), 0);
}
//图片审核通过
else {
//文字审核通过
if (news.getText_audit_status() == 1) {
updateCount = bmRiderInterestingNewsDao.updateImageAudit(interestingNewsId, 1, auditStatus, news.getVersion(), DateUtil.unixTime());
}
//文字待审核
else if (news.getText_audit_status() == 0) {
updateCount = bmRiderInterestingNewsDao.updateImageAudit(interestingNewsId, 0, auditStatus, news.getVersion(), 0);
}
//图片驳回
else {
updateCount = bmRiderInterestingNewsDao.updateImageAudit(interestingNewsId, 2, auditStatus, news.getVersion(), 0);
}
}
}
} while (updateCount == 0);
}catch (Exception e){
logger.error("#BmRiderInterestingNewsService.updateInterestingNewsAuditStatus 趣闻自动审核更新状态失败 id({}) verifyStatus({}) type({})",interestingNewsId,verifyStatus,type,e);
return 1;
}

java 乐观锁CAS的更多相关文章

  1. 并发系列2:Java并发的基石,volatile关键字、synchronized关键字、乐观锁CAS操作

    由并发大师Doug Lea操刀的并发包Concurrent是并发编程的重要包,而并发包的基石又是volatile关键字.synchronized关键字.乐观锁CAS操作这些基础.因此了解他们的原理对我 ...

  2. JUC原子操作类与乐观锁CAS

    JUC原子操作类与乐观锁CAS ​ 硬件中存在并发操作的原语,从而在硬件层面提升效率.在intel的CPU中,使用cmpxchg指令.在Java发展初期,java语言是不能够利用硬件提供的这些便利来提 ...

  3. JAVA乐观锁实现-CAS

    是什么 全称compare and swap,一个CPU原子指令,在硬件层面实现的机制,体现了乐观锁的思想. JVM用C语言封装了汇编调用.Java的基础库中有很多类就是基于JNI调用C接口实现了多线 ...

  4. Java乐观锁实现之CAS操作

    介绍CAS操作前,我们先简单看一下乐观锁 与 悲观锁这两个常见的锁概念. 悲观锁: 从Java多线程角度,存在着“可见性.原子性.有序性”三个问题,悲观锁就是假设在实际情况中存在着多线程对同一共享的竞 ...

  5. 乐观锁--CAS

    悲观锁与乐观锁的区别 悲观锁会把整个对象加锁占为已有后才去做操作,Java中的Synchronized属于悲观锁.悲观锁有一个明显的缺点就是:它不管数据存不存在竞争都加锁,随着并发量增加,且如果锁的时 ...

  6. 深入分析 Java 乐观锁

    前言 激烈的锁竞争,会造成线程阻塞挂起,导致系统的上下文切换,增加系统的性能开销.那有没有不阻塞线程,且保证线程安全的机制呢?--乐观锁. 乐观锁是什么? 操作共享资源时,总是很乐观,认为自己可以成功 ...

  7. Java乐观锁、悲观锁

    乐观锁 乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号 ...

  8. Java乐观锁的实现原理(案例)

    简要说明: 表设计时,需要往表里加一个version字段.每次查询时,查出带有version的数据记录,更新数据时,判断数据库里对应id的记录的version是否和查出的version相同.若相同,则 ...

  9. 乐观锁&CAS问题

    悲观者与乐观者的做事方式完全不一样,悲观者的人生观是一件事情我必须要百分之百完全控制才会去做,否则就认为这件事情一定会出问题:而乐观者的人生观则相反,凡事不管最终结果如何,他都会先尝试去做,大不了最后 ...

随机推荐

  1. [spring]<context:component-scan/>使用

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  2. Spring自定义注解扫描的实现

    目标:实现自定义spring自动扫描注解.主要为后期实现分布式服务框架自动注解提供技术支持 技术分析:通过配置组件扫描标签使spring解析标签. 1. JewelScanBeanDefaultPar ...

  3. zabbix自动化运维学习笔记(服务器安装)

    最近博主开始接触自动化运维.首先就是zabbix这个开源的监控系统 一开始博主只是在自己的虚拟机上尝试安装.最后终于开始在公司的服务器上正式安装,教程博主也是通过度娘找的 这是原文:链接 安装环境:C ...

  4. idea 2018注册码

    原文:https://blog.csdn.net/zhw0596/article/details/81394870 (最新的看后面!!!    转载的请附上原文链接   搜索不易!)百度的,上一个没用 ...

  5. String类的subString(a,b)方法(基于jdk 1.9)

    基于上文:http://www.jianshu.com/p/a20ee3bb9c1b public String substring(int beginIndex, int endIndex) { i ...

  6. bootstrap 知识点

    1.datetimepicker //带分钟选择 $('.form_datetime').datetimepicker({ format: 'yyyy-mm-dd HH:mm:ss', languag ...

  7. 设计模式--装饰模式C++实现

    装饰模式C++实现 1定义 动态地给一个对象添加一些额外的职责.就增加功能来说,装饰模式比生成子类更加灵活.可作为继承的替代 2类图 3实现 //构件 class Component { protec ...

  8. 【zznu-夏季队内积分赛3-G】2333

    题目描述 “别人总说我瓜,其实我一点也不瓜,大多数时候我都机智的一批“ 宝儿姐考察你一道很简单的题目.给你一个数字串,你能判断有多少个连续子串能整除3吗? 输入 多实例输入,以EOF结尾,每行一个数字 ...

  9. lvs fullnat部署手册(一)fullnat内核编译篇

    标签:kernel rpm lvs fullnat 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://shanks.blog.51c ...

  10. Ansible 1.9.0发布 来一起看看这个配置管理新贵

    Ansible 1.9.0(版本代号是Dancing In the Street,Ansible每个主要版本代号都是VanHallen乐队的一首曲子)的主要变化是: Added kerberos su ...