乐观锁是一种思想,本身代码里并没有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. bzoj1014: [JSOI2008]火星人prefix splay+hash+二分

    Description 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam,我们将这个字符串的各个字符予以标号:序号: 1 2 3 4 5 6 7 ...

  2. uva10600次小生成树模板题

    裸题,上模板就行,注意j  !  =  k #include<map> #include<set> #include<cmath> #include<queu ...

  3. [转载]宿主机为linux、windows分别实现VMware三种方式上网,Host-only win10+rhel7.2实现

    研究一下虚拟机三种上网方式 转自:http://linuxme.blog.51cto.com/1850814/389691 一.VMware三种方式工作原理1 Host-only连接方式 让虚机具有与 ...

  4. fis 前端构建工具

    1.http://fis.baidu.com/ (前端构建工具)

  5. BZOJ2259 [Oibh]新型计算机

    话说hzwer你在坑爹?... 我按照你的建图交了上去,发现WA. 开始检查= =...过了好久,突然觉得画风不对...hzwer您建图错了啊!!! 后来看了看zky的终于知道了怎么回事>_&l ...

  6. Node.js 全栈开发(二)——ES 201x 新语法的使用之基础篇

    在讲 ES 2015 新语法之前,先来说一下为什么叫 ES.JavaScript 是这门语言的名称,它有一个为它制定标准化的组织 European Computer Manufacturers Ass ...

  7. 利用CSS变量实现悬浮效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. Java线程的五种状态详解

    状态转换图 1.new状态:通过new关键字创建了Thread或其子类的对象 2.Runnable状态:即就绪状态.可从三种状态到达,new状态的Thread对象调用start()方法,Running ...

  9. Django中关于事务的代码编写

    Django中对于数据库的事务,默认每执行一句数据库操作,便会自动提交. 在Django中可以通过django.db.transaction模块提供的atomic来定义一个事务,atomic提供两种用 ...

  10. WIFI 基础知识

    转载自:wifi基本知识 如侵犯您的版权,请联系:2378264731@qq.com 1. IE802.11简介 标准号 IEEE 802.11b IEEE 802.11a IEEE 802.11g ...