目录:

【Java锁体系】一、悲观锁和乐观锁

【Java锁体系】二、Java中的CAS机制算法

【Java锁体系】三、自旋锁详解

【Java锁体系】四、Synchronized关键字详解

【Java锁体系】五、隐式锁和显氏锁的区别(Synchronized和Lock的区别)

【Java锁体系】六、AQS原理分析(AbstractQueuedSynchronizer实现分析)

【Java锁体系】七、JMM内存模型详解

【Java锁体系】八、MESI缓存一致性协议讲解

【Java锁体系】九、volatile关键字

【Java锁体系】一、悲观锁和乐观锁

Java按照锁的实现分为乐观锁和悲观锁,乐观锁和悲观锁并不是一种真实存在的锁,而是一种设计思想。

1.悲观锁

悲观锁是一种悲观思想,它总认为最坏的情况可能会出现,它认为数据很可能会被其他人所修改,所以悲观锁在持有数据的时候会把资源或者数据锁住,这样其它线程想要请求这个资源的时候就会阻塞,直到等到悲观锁把资源释放为止。传统的关系型数据库里边就用到了许多这种锁机制,比如行锁、表锁等,读锁、写锁等,都是在做操作之前先上锁。

Java中的SynchronizedReentrantLock等独占锁(排他锁)也是一种悲观锁思想的实现,因为Synchronized和ReetrantLock不管是否持有资源,它都会尝试去加锁,生怕自己心爱的宝贝被别人拿走。

2.乐观锁

乐观锁的思想与悲观锁的实现相反,它总认为资源和数据不会被别人修改,所以读取不会上锁,但是乐观锁在进行写入操作的时候会判断当前数据是否修改过。乐观锁的实现方案一般来说有两种:版本号机制CAS实现,乐观锁多适用于多读的应用类型,这样可以提高吞吐量。

在Java中java.util.concurrent.atomic包下面的原子变量类就是使用了乐观锁的一种实现方式CAS实现的。

3.总结

悲观锁:认为自己在使用数据的时候一定会有别的线程来修改数据,在获取数据的时候会加锁,确保数据不会被背的线程修改;

锁实现:关键字synchronized,接口Lock的实现类

适用场景:写操作比较多,先加锁可以保证写操作时数据正确。

乐观锁:乐观锁认为自己的使用数据时不会有别的线程修改数据,所以不会添加锁,只是在更新数据的时候去判断之前有没有别的线程更新了数据。

锁实现:CAS算法,例如AtomicInteger类的原子自增是通过CAS自旋来实现的。

使用场景:读操作较多,不加锁的特点能够使其读操作的性能大幅度提升。

【Java锁体系】一、悲观锁和乐观锁相关推荐

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

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

  2. mysql乐观锁与事务_[数据库事务与锁]详解七: 深入理解乐观锁与悲观锁

    注明: 本文转载自http://www.hollischuang.com/archives/934 在数据库的锁机制中介绍过,数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库 ...

  3. laravel mysql 锁表_Laravel中MySQL的乐观锁与悲观锁

    MySQL/InnoDB的加锁,是一个老生常谈的话题.在数据库高并发请求下,如何兼顾数据完整性与用户体验的敏捷性是一代又一代程序员一直在思考的问题. 乐观锁 乐观锁之所以叫乐观,是因为这个模式不会对数 ...

  4. mysql乐观锁处理超卖_通过乐观锁解决库存超卖的问题

    前言 在通过多线程来解决高并发的问题上,线程安全往往是最先需要考虑的问题,其次才是性能.库存超卖问题是有很多种技术解决方案的,比如悲观锁,分布式锁,乐观锁,队列串行化,Redis原子操作等.本篇通过M ...

  5. mysql insert 乐观锁_【mysql】关于乐观锁

    一.乐观锁介绍 乐观锁( Optimistic Locking ) 相对悲观锁而言,乐观锁假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检,乐观锁适用于 ...

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

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

  7. 探索JAVA并发 - 悲观锁和乐观锁

    作者:acupt,专注Java,架构师社区合伙人! 什么是悲观锁,什么是乐观锁,它们是如何实现的? 定义 悲观锁:对世界充满不信任,认为一定会发生冲突,因此在使用资源前先将其锁住,具有强烈的独占和排他 ...

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

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

  9. 五分钟学会悲观乐观锁-java vs mysql vs redis三种实现

    1 悲观锁乐观锁简介 乐观锁( Optimistic Locking ) 相对悲观锁而言,乐观锁假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果 ...

最新文章

  1. mysql.msi卸载_MySql安装与卸载的详细教程
  2. 系统架构师秘籍(二)软件架构- 续
  3. ipqc异常处理流程图_产线异常处理流程
  4. 使用MyBatis链接MySQL
  5. 游戏编程新手教程:怪物AI设计简述
  6. 计算机操作系统之存储管理
  7. GitLab 分享项目到指定小组或者指定用户
  8. matplotlib常用函数(更新中)
  9. java Statement与preparedStatement的区别
  10. Tricks(七)——list of lists 行和、列和的计算
  11. 转载:面向站长和网站管理员的Web缓存加速指南
  12. 基于Vue的车辆租赁管理系统设计与实现
  13. 北京地铁和广州地铁之感想
  14. 叶史瓦大学计算机科学,本地知名新西兰留学咨询平台排名
  15. html隐藏汉堡按钮,12种汉堡包图标按钮变形动画特效
  16. POSCMS 后台自定义链接友情链接增加搜索功能
  17. 蓝桥杯2020年上半场省赛完整版题解(Java 大学B组)
  18. 朱晔的互联网架构实践心得S2E2:写业务代码最容易掉的8种坑
  19. K-means聚类算法的应用——Python数据工程No.5
  20. docker Docs

热门文章

  1. maven自动编译,解决你每次代码修改需要重新编译的繁琐
  2. 腾讯云高级研究员张雨春:腾讯云城市计算助力行业数字化升级
  3. Fusion++: Volumetric Object-Level SLAM
  4. 7-5 英文单词排序 (25 分)
  5. android多屏互动组件,史上最实用的多屏互动教程 PC投屏(镜像)安卓
  6. ThinkPHP6 自定义指令(定时任务脚本 )使用技巧
  7. waitKey()用法
  8. 知乎上看到的一篇计算机发展史
  9. 聚创卓跃:拼多多的人群数据哪里看?
  10. 支付宝蜻蜓微信青蛙成本更低适用范围更广