java的悲观锁和乐观锁
一、悲观锁的代表是 synchronized 和 Lock 锁
①其核心思想是【线程只有占有了锁,才能去操作共享变量,每次只有一个线程占锁成功,获取锁失败的线程,都得停下来等待】
②线程从运行到阻塞、再从阻塞到唤醒,涉及线程上下文切换,如果频繁发生,影响性能
③实际上,线程在获取 synchronized 和 Lock 锁时,如果锁已被占用,都会做几次重试操作,减少阻塞的机会
二、乐观锁的代表是 AtomicInteger,使用 cas 来保证原子性
①其核心思想是【无需加锁,每次只有一个线程能成功修改共享变量,其它失败的线程不需要停止,不断重试直至成功】
②由于线程一直运行,不需要阻塞,因此不涉及线程上下文切换
③它需要多核 cpu 支持,且线程数不应超过 cpu 核数
三、乐观锁代码演示
乐观锁的代码是AtomicInteger,他的底层是Unsafe,他保证修改变量的时候是一个原子操作,我们现在想修改Account中的共享变量,修改之前我们要知道修改的成员变量的偏移位置,我们通过Unsafe对象里面一个方法,参数是修改的类型,变量名。
调用Unsafe的compareAndSetInt方法,修改之前会把当前的旧值跟共享变量最新值比较,如果没变,则修改成功。我们用debug创建一个线程修改掉他的值,相加操作无法成功,我们可以通过循环来保证这个原子操作的成功。细节:共享变量一定要volatile来修饰,保证它的可见性。
四、悲观锁和乐观锁解决线程安全问题
这边特意把相加相减操作分为三行代码,检查是否出现代码指令交错问题。debug加断点,发现是不会出现指令交错,sychronized只允许一个线程拿到锁
乐观锁是通过循环不断重试,乐观锁因为没有加锁,通过debug断点测试,发现会出现指令交错问题。但是没有关系,因为乐观锁会比对最新值,不会出现共享变量出错问题。
java的悲观锁和乐观锁相关推荐
- 探索JAVA并发 - 悲观锁和乐观锁
作者:acupt,专注Java,架构师社区合伙人! 什么是悲观锁,什么是乐观锁,它们是如何实现的? 定义 悲观锁:对世界充满不信任,认为一定会发生冲突,因此在使用资源前先将其锁住,具有强烈的独占和排他 ...
- 详解各种锁:CAS、共享锁、排它锁、互斥锁、悲观锁、乐观锁、行级锁、表级锁、页级锁、死锁、JAVA对CAS的支持、ABA问题、AQS原理
共享锁(S锁) 又称为读锁,可以查看但无法修改和删除的一种数据锁.如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排它锁.获准共享锁的事务只能读数据,不能修改数据. 共享锁下其它用 ...
- Java死锁、活锁,悲观锁、乐观锁
1.死锁与活锁的区别,死锁与饥饿的区别? 死锁:是指两个或两个以上的进程(或线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去. 产生死锁的必要条件: 互斥条 ...
- **Java有哪些悲观锁的实现_「Java并发编程」何谓悲观锁与乐观锁,Java编程你会吗...
何谓悲观锁与乐观锁 悲观锁 乐观锁 两种锁的使用场景 乐观锁常见的两种实现方式 1. 版本号机制 2. CAS算法 乐观锁的缺点 1 ABA 问题 2 循环时间长开销大 3 只能保证一个共享变量的原子 ...
- Java多线程学习十二:悲观锁和乐观锁的本质||
悲观锁和乐观锁是从是否锁住资源的角度进行分类的. 悲观锁 悲观锁比较悲观,它认为如果不锁住这个资源,别的线程就会来争抢,就会造成数据结果错误,所以悲观锁为了确保结果的正确性,会在每次获取并修改数据时, ...
- JAVA并发编程:悲观锁与乐观锁
生活 晴. 悲观与乐观的情绪概念 本篇来了解一下悲观锁和乐观锁,在了解这两个锁之前,我们首先有必要把悲观和乐观这两个词搞清楚: 悲观:对世事怀有消极的看法,认为事物总往糟糕的方向发展. 乐观:对世事怀 ...
- java里面的悲观锁和乐观锁
最近面试,面试官提到了悲观锁和乐观锁,感觉回答的不是很好,特此总结记录. 简单来说,悲观锁就是凡事都认为会出现最坏的情形,而乐观锁就是认为凡事都以最好的情形发展,对应一个消极,一个积极. 悲观锁 具有 ...
- Java悲观锁与乐观锁
Java悲观锁与乐观锁 锁的目的 实例 悲观锁实现 乐观锁实现 总结 锁的目的 多线程编程如有共用资源的使用时,需要保证数据安全,资源需要同步处理.处理资源的手段可以有:互斥同步与非阻塞同步.实现分别 ...
- 聊一聊Java中的悲观锁和乐观锁
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到网站. 文章目录 悲观锁(Pessimistic Locking) 悲观锁存的问题: 乐观锁 乐观锁存在的问 ...
- Java并发问题--乐观锁与悲观锁以及乐观锁的一种实现方式-CAS
Java并发问题–乐观锁与悲观锁以及乐观锁的一种实现方式-CAS </h1><div class="clear"></div><div c ...
最新文章
- go连接Kafka报错kafka: client has run out of available brokers to talk to
- Subversion存储库中“分支”,“标记”和“主干”的含义是什么?
- html焦点试图代码,HTML DOM focus()用法及代码示例
- Lasso回归的坐标下降法推导
- Uipath 学习栏目基础教学:8、uipath 屏幕抓取获取文本
- python leetcode_leetcode 介绍和 python 数据结构与算法学习资料
- MBR, EFI, 硬盘分区表
- 计分及竞赛软件启动时的错误现象及解决方法
- 统计推断—假设检验(hypothesis testing)
- 学习笔记--数据通信与计算机网络
- 《数据库系统概论》| 第四章 数据库安全性 知识梳理
- CC00070.bigdatajava——|Java循环结构.V09|——|Java.v09|双重for循环.v02|打印各种星星图案|
- 2011年QQ个性签名、MSN个性签名:学海无涯,回头是岸
- Jenkins-LADP认证管理员密码修改后导致Jenkins没法登陆
- oracle视图转换为mysql视图_oracle视图迁移到mysql
- Mysql中外键作用以及Navicat建立外键失败总结
- Floodlight 入门 之 起步篇 - 如何处理PacketIN消息
- Python批量获取基金数据
- 2017App Store 最新完整版审核指南
- 使用FFmpeg将视屏剪辑并上传到华为服务器上
热门文章
- 谈谈新手如何学习PHP^_^
- 董嘉文:失去的岁月如何找寻?抵达之谜揭露少年的迷茫
- 银行前置机或综合前置机ET是什么
- Datawhale pandas学习任务二:pandas基础
- Springboot+Vue的前后端分离的相册管理系统
- 凯利公式自动计算表_利用凯利公式计算每场投注的最佳比例
- 【运筹学】运输规划 ( 运输规划问题的数学模型 | 运输问题引入 )
- 渗透测试搜索指令整理(一)
- 基于Unity3D的体素沙盒游戏设计与实现(上)
- 二阶系统级联_多载波专用移动通信系统数字预失真功放线性化技术研究