乐观锁

乐观锁中,实现机制是CAS,Compare And Swap,每次要修改资源的时候,会拷贝一个副本,通过比较值是否被修改,来确定时候可以更新数据,相同则修改,不同则不改。但是为了防止出现ABA问题,我们需要在每次修改数据之后,同时更新数据的版本号。至于什么是ABA和CAS,本文不过多讲解,重点在模拟这种场景。
先给出数据格式:

public class Data {public Object body;public int version;public Data(Object body) {this.body = body;}public Data(Object body, int version) {this.body = body;this.version = version;}
}

乐观锁模拟:

import java.util.concurrent.TimeUnit;public class Lock2 {static volatile Data sourceData = new Data("152");public static void main(String[] args) {Thread thread1 = new Thread(() -> {/*模拟并发修改,不做cas处理*/while (true) {Data oldData = sourceData;//拷贝一个副本Data newData = dealBusiness(oldData);//处理业务sourceData.body = newData.body;sourceData.version++;//修改后版本号更新}}, "thread1");Thread thread2 = new Thread(() -> {sleep(1);//保证thread1先运行Data oldData = getCopyData(sourceData);//拷贝一个副本Data newData = dealBusiness(oldData);//处理业务/*乐观锁解决线程安全问题,cas*/int count = 0;while (!cas(newData, sourceData)) {oldData = getCopyData(sourceData);//重新拷贝newData = dealBusiness(oldData);//重新尝试处理count++;}System.out.printf("retry times:%d",count);}, "thread2");thread1.start();thread2.start();while (thread2.isAlive()) ;//等待线程2结束thread1.stop();//强行终止线程1,否则无法结束线程}private static synchronized boolean cas(Data newData, Data oldData) {if (oldData.version == newData.version) {oldData.body = newData.body;oldData.version++;//修改后版本号更新System.out.printf("data version is same,data update successful,request version:%d,supply version:%d\n", newData.version, oldData.version);return true;}System.out.printf("data version is not expect,update failed,request version:%d but supply version:%d\n", newData.version, oldData.version);return false;}/*** 模拟业务处理,用老数据来产生新的数据*/private static Data dealBusiness(Data oldData) {oldData.body = oldData.body.toString() + ".";return oldData;}private static void sleep(long timeout) {try {TimeUnit.SECONDS.sleep(timeout);//保证thread2线程后执行} catch (InterruptedException e) {throw new RuntimeException(e);}}public static Data getCopyData(Data srcData) {return new Data(srcData.body, srcData.version);}
}

运行结果:

data version is not expect,update failed,request version:44665 but supply version:44666
data version is not expect,update failed,request version:44666 but supply version:44667
data version is not expect,update failed,request version:44667 but supply version:44668
data version is not expect,update failed,request version:44668 but supply version:44669
data version is not expect,update failed,request version:44669 but supply version:44670
data version is same,data update successful,request version:44671,supply version:44672
retry times:405
进程已结束,退出代码0

可以看出,在我的电脑上这次运行中,cas重复了405次,说明CAS是有可能在特定场景中出现CPU占用率很高的情况,所以,CAS的缺点也比较明显。

悲观锁

悲观锁的实现比较简单,这里给出简单的代码模拟。
悲观锁模拟:

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;public class Lock {static Data sourceData = new Data("152");public static void main(String[] args) throws InterruptedException {long data = 152708993L;ReentrantLock lock = new ReentrantLock();Thread thread1 = new Thread(() -> {/*模拟并发修改*/while (true) {lock.lock();Data newData = dealBusiness(sourceData);updateSourceData(newData);System.out.print("修改中数据中...");lock.unlock();}});Thread thread2 = new Thread(() -> {try {lock.lock();System.out.println("\n\n已经抢到锁,开始修改数据");Data newData = dealBusiness(sourceData);updateSourceData(newData);System.out.println("数据修改成功\n");lock.unlock();} catch (Exception e) {throw new RuntimeException(e);}});thread1.start();thread2.start();while (thread2.isAlive()) ;//等待线程2结束thread1.stop();//强行终止线程1,否则无法结束线程}/*处理业务*/private static Data dealBusiness(Data oldData) {oldData.body = oldData.body.toString() + ".";return oldData;}private static void updateSourceData(Data data){sourceData = data;}}

代码小白,不妥之处轻而喷之!

用Java模拟乐观锁和悲观锁相关推荐

  1. Java 乐观锁和悲观锁

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

  2. **Java有哪些悲观锁的实现_面试4连问:乐观锁与悲观锁的概念、实现方式、场景、优缺点?...

    推荐阅读: 数据库面试4连问:分库分表,中间件,优缺点,如何拆分? 终极手撕之架构大全:分布式+框架+微服务+性能优化,够不够? 消息队列面试,你能顶得住面试官这波10大连环炮的攻势吗? 01 乐观锁 ...

  3. 详解各种锁:CAS、共享锁、排它锁、互斥锁、悲观锁、乐观锁、行级锁、表级锁、页级锁、死锁、JAVA对CAS的支持、ABA问题、AQS原理

    共享锁(S锁) 又称为读锁,可以查看但无法修改和删除的一种数据锁.如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排它锁.获准共享锁的事务只能读数据,不能修改数据. 共享锁下其它用 ...

  4. Java死锁、活锁,悲观锁、乐观锁

    1.死锁与活锁的区别,死锁与饥饿的区别? 死锁:是指两个或两个以上的进程(或线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去. 产生死锁的必要条件: 互斥条 ...

  5. 乐观锁和悲观锁的使用场景及应用——Java高并发系列学习笔记

    一. 定义 1.乐观锁:顾名思义,对每次的数据操作都保持乐观的态度,不担心数据会被修改,所以不会对数据进行上锁.由于数据没有上锁,这就存在数据会被多人读写的情况.所以每次修改数据的时候需要对数据进行判 ...

  6. **Java有哪些悲观锁的实现_「Java并发编程」何谓悲观锁与乐观锁,Java编程你会吗...

    何谓悲观锁与乐观锁 悲观锁 乐观锁 两种锁的使用场景 乐观锁常见的两种实现方式 1. 版本号机制 2. CAS算法 乐观锁的缺点 1 ABA 问题 2 循环时间长开销大 3 只能保证一个共享变量的原子 ...

  7. Java并发篇_乐观锁与悲观锁

    乐观锁对应于生活中乐观的人总是想着事情往好的方向发展,悲观锁对应于生活中悲观的人总是想着事情往坏的方向发展. 一.引入概念 1.悲观锁 总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次 ...

  8. Java并发编程(05):悲观锁和乐观锁机制

    本文源码:GitHub·点这里 || GitEE·点这里 一.资源和加锁 1.场景描述 多线程并发访问同一个资源问题,假如线程A获取变量之后修改变量值,线程C在此时也获取变量值并且修改,两个线程同时并 ...

  9. Java多线程学习总结(5)——乐观锁和悲观锁的基本概念、实现方式(含实例)、适用场景及常见面试题

     分享一个大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到人工智能的队伍中来!点击浏览教程 一.基本概念 乐观锁和悲观锁是两种思想,用于解决并发场景下的数据竞争问题. 乐观锁 ...

  10. Java并发 乐观锁和悲观锁 乐观锁的一种实现方式CAS

    为什么80%的码农都做不了架构师?>>>    首先介绍一些乐观锁与悲观锁: 悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人 ...

最新文章

  1. ActiveMQ基本内容及安装部署
  2. Hash+哈希+哈希函数
  3. python基础第二天(day14)
  4. 2020年全国硕士研究生招生考试考生进入复试的初试成绩基本要求(学术学位类)
  5. asp服务器端作用,ASP中的服务器端脚本代码由()解释执行。 - 问答库
  6. 初识Qt Creator
  7. percona-toolkit 之 【pt-table-checksum】、【pt-table-sync】说明
  8. c#写字板实现加粗功能_Windows 7中写字板和绘画中的新功能
  9. pat00-自测5. Shuffling Machine (20)
  10. 大三了,计算机专业学生的困惑。 [转]
  11. word删除所有的回车、空格
  12. 微信小程序之自定义toast弹窗
  13. hdu 4334 Trouble 排序+优化 多校联合赛(四)第四题
  14. #36328;#36234;#23457;#26680;#26426;#21046;#30340;gladder#25554;#20214;
  15. GD32F103与STM32F103的区别 2021.6.2
  16. 计算机桌面上的声音图标没了怎么办,右下角小喇叭不见了-电脑桌面右下角有一个调整声音的小喇叭图标没有了,怎么能调出来,电? 爱问知识人...
  17. 基于WIFI-Pumpkin的流氓AP的实现
  18. Node + WebSocket + Vue 聊天室创建群聊/加入群聊功能 – 第五章
  19. 管理打开的标签,减少Chrome95%内存 —OneTab
  20. 村庄规划工作底图制作

热门文章

  1. 完整考勤功能(企业云)
  2. idea更改本地依赖位置Libraries仍然爆红解决方案
  3. ipad里app下载
  4. 解决VS2019提示源代码的内容和内置源代码的内容不一致
  5. 我是学计算机的表情包,计算机考试表情包 - 计算机考试微信表情包 - 计算机考试QQ表情包 - 发表情 fabiaoqing.com...
  6. 百度智能云产业智能化新生态,新在哪里?
  7. 如何助力银行保险机构开展“侵害个人信息权益乱象专项整治工作”
  8. Xilinx AXI4 协议
  9. 不错的在线视频下载软件
  10. 千兆以太网(三)——ARP协议