这里用版本号实现

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乐观锁简单实现相关推荐

  1. java乐观锁实现_Java 乐观锁原理与实战演练

    原标题:Java 乐观锁原理与实战演练 一. 前言 最近在做一个简单审批流程的项目,由于只有固定二级审批所以没有工作流组件,然后就遇到一个审批节点捞单时候,多个人同时审批时候如何保证业务正常运行的问题 ...

  2. Java乐观锁的实现原理和典型案例

    Java乐观锁的实现原理 什么是乐观锁? 在并发编程中,多个线程同时对同一资源进行操作时,需要使用锁来保证数据的一致性. 乐观锁与悲观锁是两种不同的锁机制. 悲观锁会在整个操作期间占用资源的独占性,以 ...

  3. Java 乐观锁和悲观锁

    文章目录 Java 乐观锁和悲观锁 1.悲观锁 2.乐观锁 2.1 CAS 2.2 模拟CAS算法 2.3 JUC 2.4 CAS中的ABA问题 2.5 使用CAS会引发的问题 Java 乐观锁和悲观 ...

  4. Java 乐观锁 悲观锁

    一.乐观锁.悲观锁定义 乐观锁:乐观锁在操作数据时非常乐观,认为别人不会同时修改数据.因此乐观锁不会上锁,只是在执行更新的时候判断一下在此期间别人是否修改了数据:如果别人修改了数据则放弃操作,否则执行 ...

  5. java 乐观锁 实例_JAVA乐观锁实现-CAS(示例代码)

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

  6. java 乐观锁和悲观锁,Threadlocal

    7.乐观锁和悲观锁 悲观锁(Pessimistic Lock)顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会 block 直到它拿到 ...

  7. java乐观锁实现案例

    简单说说乐观锁.乐观锁是相对于悲观锁而言.悲观锁认为,这个线程,发生并发的可能性极大,线程冲突几率大,比较悲观.一般用synchronized实现,保证每次操作数据不会冲突.乐观锁认为,线程冲突可能性 ...

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

    锁,当多个事务同时对数据库表中的同一条数据操作时,如果没有加锁机制的话,就会产生脏数据(duty data). 有2种机制可以解决这个问题:就是悲观锁和乐观锁了. 这里我们使用乐观锁,通过案例代码来实 ...

  9. Java乐观锁%悲观锁

    1.乐观锁 尝试去获得一把锁,无论获得还是无法获得立刻返回True/False 不会阻塞进程,使用此锁可在获取锁的过程中完成其它操作.如下例子演示了在线程1获得了锁之后,线程2使用trylock()可 ...

最新文章

  1. 解题报告(二)B、(P3338 [ZJOI2014])力(FFT经典套路)(2)
  2. python读写json文件
  3. MVC自定义视图规则
  4. 苹果笔记本电脑电池保养细则
  5. 速学c++(1)-c++简介
  6. CSS基础---日记4
  7. cnn 准确率无法提升_清华类脑芯片再登Nature: 全球首款基于忆阻器的CNN存算一体芯片...
  8. ieda使用 在jsp页面中,有时候会出现不能智能显示方法 idea pageContext.setAttribute...
  9. autocad+服务器未响应,CAD图纸打开未响应解决的方法
  10. Java利用POI生成Word、Excel文档转换成PDF,PDF转换成图片
  11. 离散域下的泊松方程求解(python实现)
  12. 从百草园到三味书屋,从servlet到springmvc
  13. IDEA谷歌翻译插件提示:更新 TKK 失败,请检查网络连接
  14. QT qss选择器------后代选择器
  15. 汇编中esp和ebp在函数栈空间的保存和变化 call的参数和局部变量的关系详解
  16. 把你心中的女神娶回家(一) --有关婚姻的误读暨片头注释(上)
  17. python xlrd pandas_python处理excel方式(openpyxl,xlrd,xlwt,openpyxl,panda)
  18. “大数据杀熟”谁之祸?
  19. python手写板,机器语言之手写识别_源码时代Python公开课|Python培训
  20. 机房如何防止雷电攻击?手把手教你

热门文章

  1. 【转】爆笑程序员的笑话集锦
  2. 机器人抓取实验演示视频
  3. el-tree 懒加载的实现以及局部刷新
  4. 圣诞节到了,一起来画个圣诞树吧
  5. fiddler抓包新闻APP
  6. 网络编程的三个重要信号(SIGHUP ,SIGPIPE,SIGURG)
  7. 自定义事件详解以及实现有趣B站直播间弹幕轰炸功能
  8. 屏幕适配——系统升级android 8.0 部分UI出现错乱——“可用屏幕分辨率”
  9. 7-9 天梯赛团队总分
  10. Bugku S3 AWD排位赛-1 pwn