一、悲观锁的代表是 synchronized 和 Lock 锁

①其核心思想是【线程只有占有了锁,才能去操作共享变量,每次只有一个线程占锁成功,获取锁失败的线程,都得停下来等待】

②线程从运行到阻塞、再从阻塞到唤醒,涉及线程上下文切换,如果频繁发生,影响性能

③实际上,线程在获取 synchronized 和 Lock 锁时,如果锁已被占用,都会做几次重试操作,减少阻塞的机会

二、乐观锁的代表是 AtomicInteger,使用 cas 来保证原子性

①其核心思想是【无需加锁,每次只有一个线程能成功修改共享变量,其它失败的线程不需要停止,不断重试直至成功】

②由于线程一直运行,不需要阻塞,因此不涉及线程上下文切换

③它需要多核 cpu 支持,且线程数不应超过 cpu 核数

三、乐观锁代码演示

乐观锁的代码是AtomicInteger,他的底层是Unsafe,他保证修改变量的时候是一个原子操作,我们现在想修改Account中的共享变量,修改之前我们要知道修改的成员变量的偏移位置,我们通过Unsafe对象里面一个方法,参数是修改的类型,变量名。

调用Unsafe的compareAndSetInt方法,修改之前会把当前的旧值跟共享变量最新值比较,如果没变,则修改成功。我们用debug创建一个线程修改掉他的值,相加操作无法成功,我们可以通过循环来保证这个原子操作的成功。细节:共享变量一定要volatile来修饰,保证它的可见性。

四、悲观锁和乐观锁解决线程安全问题

这边特意把相加相减操作分为三行代码,检查是否出现代码指令交错问题。debug加断点,发现是不会出现指令交错,sychronized只允许一个线程拿到锁

乐观锁是通过循环不断重试,乐观锁因为没有加锁,通过debug断点测试,发现会出现指令交错问题。但是没有关系,因为乐观锁会比对最新值,不会出现共享变量出错问题。

java的悲观锁和乐观锁相关推荐

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

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

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

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

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

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

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

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

  5. Java多线程学习十二:悲观锁和乐观锁的本质||

    悲观锁和乐观锁是从是否锁住资源的角度进行分类的. 悲观锁 悲观锁比较悲观,它认为如果不锁住这个资源,别的线程就会来争抢,就会造成数据结果错误,所以悲观锁为了确保结果的正确性,会在每次获取并修改数据时, ...

  6. JAVA并发编程:悲观锁与乐观锁

    生活 晴. 悲观与乐观的情绪概念 本篇来了解一下悲观锁和乐观锁,在了解这两个锁之前,我们首先有必要把悲观和乐观这两个词搞清楚: 悲观:对世事怀有消极的看法,认为事物总往糟糕的方向发展. 乐观:对世事怀 ...

  7. java里面的悲观锁和乐观锁

    最近面试,面试官提到了悲观锁和乐观锁,感觉回答的不是很好,特此总结记录. 简单来说,悲观锁就是凡事都认为会出现最坏的情形,而乐观锁就是认为凡事都以最好的情形发展,对应一个消极,一个积极. 悲观锁 具有 ...

  8. Java悲观锁与乐观锁

    Java悲观锁与乐观锁 锁的目的 实例 悲观锁实现 乐观锁实现 总结 锁的目的 多线程编程如有共用资源的使用时,需要保证数据安全,资源需要同步处理.处理资源的手段可以有:互斥同步与非阻塞同步.实现分别 ...

  9. 聊一聊Java中的悲观锁和乐观锁

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到网站. 文章目录 悲观锁(Pessimistic Locking) 悲观锁存的问题: 乐观锁 乐观锁存在的问 ...

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

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

最新文章

  1. go连接Kafka报错kafka: client has run out of available brokers to talk to
  2. Subversion存储库中“分支”,“标记”和“主干”的含义是什么?
  3. html焦点试图代码,HTML DOM focus()用法及代码示例
  4. Lasso回归的坐标下降法推导
  5. Uipath 学习栏目基础教学:8、uipath 屏幕抓取获取文本
  6. python leetcode_leetcode 介绍和 python 数据结构与算法学习资料
  7. MBR, EFI, 硬盘分区表
  8. 计分及竞赛软件启动时的错误现象及解决方法
  9. 统计推断—假设检验(hypothesis testing)
  10. 学习笔记--数据通信与计算机网络
  11. 《数据库系统概论》| 第四章 数据库安全性 知识梳理
  12. CC00070.bigdatajava——|Java循环结构.V09|——|Java.v09|双重for循环.v02|打印各种星星图案|
  13. 2011年QQ个性签名、MSN个性签名:学海无涯,回头是岸
  14. Jenkins-LADP认证管理员密码修改后导致Jenkins没法登陆
  15. oracle视图转换为mysql视图_oracle视图迁移到mysql
  16. Mysql中外键作用以及Navicat建立外键失败总结
  17. Floodlight 入门 之 起步篇 - 如何处理PacketIN消息
  18. Python批量获取基金数据
  19. 2017App Store 最新完整版审核指南
  20. 使用FFmpeg将视屏剪辑并上传到华为服务器上

热门文章

  1. 谈谈新手如何学习PHP^_^
  2. 董嘉文:失去的岁月如何找寻?抵达之谜揭露少年的迷茫
  3. 银行前置机或综合前置机ET是什么
  4. Datawhale pandas学习任务二:pandas基础
  5. Springboot+Vue的前后端分离的相册管理系统
  6. 凯利公式自动计算表_利用凯利公式计算每场投注的最佳比例
  7. 【运筹学】运输规划 ( 运输规划问题的数学模型 | 运输问题引入 )
  8. 渗透测试搜索指令整理(一)
  9. 基于Unity3D的体素沙盒游戏设计与实现(上)
  10. 二阶系统级联_多载波专用移动通信系统数字预失真功放线性化技术研究