java乐观锁简单实现
这里用版本号实现
sql
CREATE TABLE `t_optimistic` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL COMMENT '商品名称',`num` int(11) DEFAULT NULL COMMENT '商品库存',`version` int(255) DEFAULT NULL COMMENT '版本号',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;-- ----------------------------
-- Records of t_optimistic
-- ----------------------------
INSERT INTO `t_optimistic` VALUES ('1', 'java从入门到入土', '1', '0');
INSERT INTO `t_optimistic` VALUES ('2', 'c++从入门到入土', '1', '0');
po
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("t_optimistic")
public class Optimistic implements Serializable {private static final long serialVersionUID = 1L;@TableId(value = "id", type = IdType.AUTO)private Long id;/*** 商品名称*/private String name;/*** 商品库存*/private Integer num;/*** 版本号*/private Integer version;
}
测试类实现代码
这里用Phaser模拟2个线程同时启动,更新时减少库存增加版本号,条件为所带id以及版本号
@SpringBootTest
class OptimisticApplicationTests {@Autowiredprivate OptimisticService optimisticService;@Testvoid optimistic() {//模拟2个用户拿到数据Optimistic optimistic = optimisticService.lambdaQuery().eq(Optimistic::getName, "java从入门到入土").one();Phaser phaser = new Phaser();phaser.register();new Thread(() -> { //实现runnable接口的实现类phaser.arriveAndAwaitAdvance();if (optimistic.getNum()==0){throw new RuntimeException("用户1库存不足!");}//更新操作boolean update = optimisticService.lambdaUpdate().set(Optimistic::getNum, optimistic.getNum() - 1).set(Optimistic::getVersion, optimistic.getVersion() + 1).eq(Optimistic::getId, optimistic.getId()).eq(Optimistic::getVersion, optimistic.getVersion()).update();if (update==true){System.out.println("用户1操作成功!");} else {throw new RuntimeException("用户1更新失败请重试!");}}).start();new Thread(() -> { //实现runnable接口的实现类phaser.arriveAndAwaitAdvance();if (optimistic.getNum()==0){throw new RuntimeException("用户2库存不足!");}//更新操作boolean update = optimisticService.lambdaUpdate().set(Optimistic::getNum, optimistic.getNum() - 1).set(Optimistic::getVersion, optimistic.getVersion() + 1).eq(Optimistic::getId, optimistic.getId()).eq(Optimistic::getVersion, optimistic.getVersion()).update();if (update==true){System.out.println("用户2操作成功!");} else {throw new RuntimeException("用户2更新失败请重试!");}}).start();//线程执行phaser.arriveAndAwaitAdvance();}}
运行测试
结果有一个用户更新失败
java乐观锁简单实现相关推荐
- java乐观锁实现_Java 乐观锁原理与实战演练
原标题:Java 乐观锁原理与实战演练 一. 前言 最近在做一个简单审批流程的项目,由于只有固定二级审批所以没有工作流组件,然后就遇到一个审批节点捞单时候,多个人同时审批时候如何保证业务正常运行的问题 ...
- Java乐观锁的实现原理和典型案例
Java乐观锁的实现原理 什么是乐观锁? 在并发编程中,多个线程同时对同一资源进行操作时,需要使用锁来保证数据的一致性. 乐观锁与悲观锁是两种不同的锁机制. 悲观锁会在整个操作期间占用资源的独占性,以 ...
- Java 乐观锁和悲观锁
文章目录 Java 乐观锁和悲观锁 1.悲观锁 2.乐观锁 2.1 CAS 2.2 模拟CAS算法 2.3 JUC 2.4 CAS中的ABA问题 2.5 使用CAS会引发的问题 Java 乐观锁和悲观 ...
- Java 乐观锁 悲观锁
一.乐观锁.悲观锁定义 乐观锁:乐观锁在操作数据时非常乐观,认为别人不会同时修改数据.因此乐观锁不会上锁,只是在执行更新的时候判断一下在此期间别人是否修改了数据:如果别人修改了数据则放弃操作,否则执行 ...
- java 乐观锁 实例_JAVA乐观锁实现-CAS(示例代码)
是什么 全称compare and swap,一个CPU原子指令,在硬件层面实现的机制,体现了乐观锁的思想. JVM用C语言封装了汇编调用.Java的基础库中有很多类就是基于JNI调用C接口实现了多线 ...
- java 乐观锁和悲观锁,Threadlocal
7.乐观锁和悲观锁 悲观锁(Pessimistic Lock)顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会 block 直到它拿到 ...
- java乐观锁实现案例
简单说说乐观锁.乐观锁是相对于悲观锁而言.悲观锁认为,这个线程,发生并发的可能性极大,线程冲突几率大,比较悲观.一般用synchronized实现,保证每次操作数据不会冲突.乐观锁认为,线程冲突可能性 ...
- Java乐观锁的实现原理(案例)
锁,当多个事务同时对数据库表中的同一条数据操作时,如果没有加锁机制的话,就会产生脏数据(duty data). 有2种机制可以解决这个问题:就是悲观锁和乐观锁了. 这里我们使用乐观锁,通过案例代码来实 ...
- Java乐观锁%悲观锁
1.乐观锁 尝试去获得一把锁,无论获得还是无法获得立刻返回True/False 不会阻塞进程,使用此锁可在获取锁的过程中完成其它操作.如下例子演示了在线程1获得了锁之后,线程2使用trylock()可 ...
最新文章
- 解题报告(二)B、(P3338 [ZJOI2014])力(FFT经典套路)(2)
- python读写json文件
- MVC自定义视图规则
- 苹果笔记本电脑电池保养细则
- 速学c++(1)-c++简介
- CSS基础---日记4
- cnn 准确率无法提升_清华类脑芯片再登Nature: 全球首款基于忆阻器的CNN存算一体芯片...
- ieda使用 在jsp页面中,有时候会出现不能智能显示方法 idea pageContext.setAttribute...
- autocad+服务器未响应,CAD图纸打开未响应解决的方法
- Java利用POI生成Word、Excel文档转换成PDF,PDF转换成图片
- 离散域下的泊松方程求解(python实现)
- 从百草园到三味书屋,从servlet到springmvc
- IDEA谷歌翻译插件提示:更新 TKK 失败,请检查网络连接
- QT qss选择器------后代选择器
- 汇编中esp和ebp在函数栈空间的保存和变化 call的参数和局部变量的关系详解
- 把你心中的女神娶回家(一) --有关婚姻的误读暨片头注释(上)
- python xlrd pandas_python处理excel方式(openpyxl,xlrd,xlwt,openpyxl,panda)
- “大数据杀熟”谁之祸?
- python手写板,机器语言之手写识别_源码时代Python公开课|Python培训
- 机房如何防止雷电攻击?手把手教你