java 乐观锁CAS
乐观锁是一种思想,本身代码里并没有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的更多相关文章
- 并发系列2:Java并发的基石,volatile关键字、synchronized关键字、乐观锁CAS操作
由并发大师Doug Lea操刀的并发包Concurrent是并发编程的重要包,而并发包的基石又是volatile关键字.synchronized关键字.乐观锁CAS操作这些基础.因此了解他们的原理对我 ...
- JUC原子操作类与乐观锁CAS
JUC原子操作类与乐观锁CAS 硬件中存在并发操作的原语,从而在硬件层面提升效率.在intel的CPU中,使用cmpxchg指令.在Java发展初期,java语言是不能够利用硬件提供的这些便利来提 ...
- JAVA乐观锁实现-CAS
是什么 全称compare and swap,一个CPU原子指令,在硬件层面实现的机制,体现了乐观锁的思想. JVM用C语言封装了汇编调用.Java的基础库中有很多类就是基于JNI调用C接口实现了多线 ...
- Java乐观锁实现之CAS操作
介绍CAS操作前,我们先简单看一下乐观锁 与 悲观锁这两个常见的锁概念. 悲观锁: 从Java多线程角度,存在着“可见性.原子性.有序性”三个问题,悲观锁就是假设在实际情况中存在着多线程对同一共享的竞 ...
- 乐观锁--CAS
悲观锁与乐观锁的区别 悲观锁会把整个对象加锁占为已有后才去做操作,Java中的Synchronized属于悲观锁.悲观锁有一个明显的缺点就是:它不管数据存不存在竞争都加锁,随着并发量增加,且如果锁的时 ...
- 深入分析 Java 乐观锁
前言 激烈的锁竞争,会造成线程阻塞挂起,导致系统的上下文切换,增加系统的性能开销.那有没有不阻塞线程,且保证线程安全的机制呢?--乐观锁. 乐观锁是什么? 操作共享资源时,总是很乐观,认为自己可以成功 ...
- Java乐观锁、悲观锁
乐观锁 乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号 ...
- Java乐观锁的实现原理(案例)
简要说明: 表设计时,需要往表里加一个version字段.每次查询时,查出带有version的数据记录,更新数据时,判断数据库里对应id的记录的version是否和查出的version相同.若相同,则 ...
- 乐观锁&CAS问题
悲观者与乐观者的做事方式完全不一样,悲观者的人生观是一件事情我必须要百分之百完全控制才会去做,否则就认为这件事情一定会出问题:而乐观者的人生观则相反,凡事不管最终结果如何,他都会先尝试去做,大不了最后 ...
随机推荐
- IntelliJ IDEA 2017 主题安装及配置
主题哪里下的? 网站:http://www.riaway.com/ 主题怎么安装? 然后选择文件,找到下载的主题,按步骤,重启之后即可使用: 主题如何配置? 以下所有配置基于 IntelliJ IDE ...
- Les13 性能管理
目标 使用Oracle Enterprise Manager监视性能 使用自动内存管理(AMM) 使用内存指导调整内存缓冲区的大小 查看与性能相关的动态视图 排除无效和不可用对象产生的故障 性能监视 ...
- 《深入理解mybatis原理3》 Mybatis数据源与连接池
<深入理解mybatis原理> Mybatis数据源与连接池 对于ORM框架而言,数据源的组织是一个非常重要的一部分,这直接影响到框架的性能问题.本文将通过对MyBatis框架的数据源结构 ...
- 5.彻底理解volatile
1. volatile简介 在上一篇文章中我们深入理解了java关键字synchronized,我们知道在java中还有一大神器就是关键volatile,可以说是和synchronized各领风骚,其 ...
- sql 多个字段分组,删除重复记录,保留ID最小的一条
IF OBJECT_ID('cardDetail') IS NOT NULL DROP TABLE cardDetail CREATE TABLE cardDetail ( id ,) PRIMARY ...
- MySQLdb和PIL安装
最近将个人博客部署到树莓派上海真是颇费周折,尤其是在MySQLdb和PIL的安装上 MySQLdb 先说Windows吧(比较简单) 直接pip安装即可或者下载编译版更方便:http://source ...
- 更改gitlab默认端口
若linux服务器的80和8080端口都已经被使用,则需修改gitlab监听的端口 修改路径文件:vim /etc/gitlab/gitlab.rb 1.修改external_url 'http:// ...
- C++复习14 构造函数初始化调用顺序
1.关于构造函数初始化调用顺序的问题. 首先是父类和子类的,首先调用父类的构造函数,然后调用子类的构造函数.但是对于子类中有其他类型的数据成员的时候,会在调用该类的构造函数之前,调用其数据成员的构造函 ...
- lseek使用说明
lseek使用说明 表头文件#include<sys/types.h>#include<unistd.h> 定义函数off_t lseek(int filde,off_t of ...
- LeetCode OJ:Candy(糖果问题)
There are N children standing in a line. Each child is assigned a rating value. You are giving candi ...