我们今天就来了解一下锁中的乐观锁和悲观锁。

在面试中,如果是Java后天研发的工程师,很有可能会考到这一个知识点。所以今天也就来说下这个。

两者的概念

乐观锁

  • 根据表面上来看每次去拿数据的时候认为别人都不会修改。所以不会上锁,有着更宽松的锁机制,减少了性能的开销。

  • 在更新的时候会根据版本号进行判断是否有程序去修改这个数据,例如版本号等机制,使用版本号的机制在进行数据提交的时候,如果版本号大于对应的版本号那么进行更新,否则不进行更新。

  • 在大多数情况下乐观锁使用在读多的应用上。在java中我们所了解的atomic包中,常用的线程安全的变量是使用的该锁机制。

  • 乐观锁不能解决脏读问题

悲观锁

  • 相对乐观锁来说,悲观锁具有强烈的独占和排他特性。该锁机制总是假设最坏的情况,每次去拿数据的时候都会认为别人会修改,所以在取数据的时候会进行加锁的操作。在这样的情况下,别的程序代码操作,需要进行等待操作,直到其拿到锁为止。

java中实现该两种机制的锁

在整个操作系统中,Cpu是分片操作的,在程序的执行过程中,会进行线程间的切换,也就是cpu的切换。Cpu的切换是很耗费时间,所以我们如果想减少CPU的切换,可以让某个线程一直持有该CPU,所以可以采用循环的方式来实现。

悲观锁

我们Java中使用的synchronized 就是一种典型的悲观锁的实现,该锁是拥有独占性,和排他性保证了线程 的安全,所以我们说synchronized是悲观锁。

  • 优点:对数据处理安全起到了安全的作用。

  • 缺点:

  1. 因为加锁 排他性,那么就会损耗性能,降低了并行性,增加了系统负载。

  2. 容易出现死锁的情况。

乐观锁

平常使用的CAS的安全操作类就属于乐观锁机制。还有我们经常说的自旋锁,轻量级锁,偏向锁这些也属于乐观锁。乐观锁为什么乐观,是因为减少了对CPU之间的切换,挂起,阻塞 ,唤醒等机制的操作造成的开销。所以在开销上,乐观锁更占一筹,减少了性能的损耗。建议对性能要求高,读请求多的使用该机制。

下面介绍下可以使用这些CAS操作一些类的使用

```AtomicInteger  one = new AtomicInteger();AtomicLong  atomicLong = new AtomicLong();AtomicReference student  = new AtomicReference<>();one.get() ; //获得值one.addAndGet(2) ;  //增加指定的值one.incrementAndGet();  //增加1one.getAndSet(0);  //先得到 原先值 然后在置为0one.longValue();  //转为 long型```

转载:

原创: mengrui LuckQI

java-乐观锁与悲观锁相关推荐

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

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

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

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

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

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

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

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

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

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

  6. Java之乐观锁和悲观锁

    Java之乐观锁和悲观锁 乐观锁 用到的机制是CAS(Compare and Swap),每个线程都可以访问,只有在提交数据的时候,检查是否违反了数据的完整性.如果发生冲突失败重试,直到成功为止.乐观 ...

  7. Java并发问题--乐观锁与悲观锁以及乐观锁的一种实现方式-CAS

    Java并发问题–乐观锁与悲观锁以及乐观锁的一种实现方式-CAS </h1><div class="clear"></div><div c ...

  8. java中的锁(悲观锁、乐观锁、可重入锁、不可重入锁、公平锁、非公平锁、自旋锁、阻塞锁...)

    Lock接口 1.简介.地位.作用 ① 锁是一种工具,用于控制对共享资源的访问 ② Lock和synchronized,这两个是最常见的锁,它们都可以达到线程安全的目的,但是在使用和功能上又有较大的不 ...

  9. java中的锁---乐观锁与悲观锁的区别

    锁,是开发中不得不掌握的一个知识点. 在面试中也会经常问到.其中乐观锁与悲观锁为最常见.首先介绍下两种锁 一:乐观锁: 1 介绍: 它的心态很好,每次别人使用它的时候,它会乐观的认为别人不修改数据,所 ...

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

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

最新文章

  1. INNODB在裸设备上的性能简单测试
  2. Ubuntu启动Apache
  3. 如何升级cordova插件
  4. Xcode6中自动布局autolayout和sizeclass的使用
  5. HTTP API 设计指南(响应部分)
  6. 深入浅出统计学——笔记(一)1~3章
  7. EasyRecovery2022数据恢复绿色版
  8. 高通9008端口刷linux,高通命令进入9008端口方式汇总
  9. 大湿教我写程序(2)之走向AV之路
  10. Java中模拟评分系统_评分系统.java
  11. 软件工程师 级别 职称 评定 从见习程序员 到 主任软件工程师
  12. kasp技术原理_KASP-基于已知SNP的高通量基因分型
  13. math_常用放缩不等式及其变形@指数@对数@三角函数@一次函数
  14. Android hilt 依赖注入使用详解
  15. 自制Darknet Yolo目标快速标注工具
  16. 一步一动在PVE安装黑群晖
  17. 双 JK 触发器 74LS112 逻辑功能。真值表_【第十章】触发器和事件
  18. 工业机器人协作控制研究
  19. 查询保存过的wifi的密码
  20. javascript检测浏览器是否安装某个插件

热门文章

  1. Atitit 资源类型的分类法规范MIME类型类型 目录 1.1. 一个MIME类型至少包括两个部分:一个类型(type)和一个子类型(subtype)。 1 1.2. 命名格式MIME类型包括一个
  2. Atitit 同步获取阻塞式命令行输出 费阻塞式样命令行执行完毕后退出了,可以直接获取其输出 InputStream is = new StreamGobbler(session.getStd
  3. Atitit 大脑能够储存多大的数据量
  4. atitit.vod search doc.doc 点播系统搜索功能设计文档
  5. atitit.解决net.sf.json.JSONException There is a cycle in the hierarchy
  6. paip.提高用户体验----增添开始菜单类似360小助手按钮总结 (补充c925)
  7. (转)以案说法 | ICO,刑事风险要远离!
  8. 今天的C位,必须是这位浙大卜教授!
  9. 到上海,与陈绪零距离
  10. 【情感识别】基于matlab GUI SVM语音情感识别(带面板)【含Matlab源码 876期】