轻量级锁和偏向锁
来源:互联网 发布:部落冲突女王数据 编辑:程序博客网 时间:2024/05/01 03:35
偏向锁与轻量级锁理念上的区别:
轻量级锁:在无竞争的情况下使用CAS操作去消除同步使用的互斥量
偏向锁:在无竞争的情况下把整个同步都消除掉,连CAS操作都不做了
轻量级锁
轻量级锁(Lightweight Locking)本意是在没有多线程竞争的前提下,减少传统的重量级锁使用操作系统互斥量产生的性能消耗,是为了减少多线程进入互斥的几率,并不是要替代互斥。
在代码进入同步块的时候,如果此同步对象没有被锁定(锁标志位为“01”状态),虚拟机首先将在当前线程的栈帧中建立一个名为锁记录(Lock Record)的空间,用于存储锁记录目前的Mark Word的拷贝(称为Displaced Mark Word)
然后,虚拟机将使用CAS操作尝试将对象的Mark Word更新为指向Lock Record的指针。如果这个更新动作成功了,那么这个线程就拥有了该对象的锁,并且对象Mark Word的锁标志位(Mark Word的最后2bit)将转变为“00”,即表示此对象处于轻量级锁定状态
如果这个更新操作失败了,虚拟机首先会检查对象的Mark Word是否指向当前线程的栈帧。如果指向,说明当前线程已经拥有了这个对象的锁,那就可以直接进入同步块继续执行,否则说明这个锁对象已经被其他线程抢占了。如果有两条以上的线程争用同一个锁,那轻量级锁就不再有效,要膨胀为重量级锁,锁标志的状态值变为”10”,Mark Word中存储的就是指向重量级(互斥量)的指针
偏向锁
当锁对象第一次被线程获取的时候,虚拟机把对象头中的标志位设为“01”,即偏向模式。同时使用CAS操作把获取到这个锁的线程的ID记录在对象的Mark Word之中的偏向线程ID,并将是否偏向锁的状态位置置为1。
如果CAS操作成功,持有偏向锁的线程以后每次进入这个锁相关的同步块时,直接检查ThreadId是否和自身线程Id一致,
如果一致,则认为当前线程已经获取了锁,虚拟机就可以不再进行任何同步操作(例如Locking、Unlocking及对Mark Word的Update等)。
当有另外一个线程去尝试获取这个锁时,偏向模式就宣告结束。根据锁对象目前是否处于被锁定的状态,撤销偏向(Revoke Bias)后恢复到未锁定(标志位为“01”)或轻量级锁定(标志位为“00”)的状态,后续的同步操作就如上面介绍的轻量级那样执行。
- 偏向锁和轻量级锁
- 轻量级锁和偏向锁
- jdk的轻量级锁和偏向锁
- 轻量级锁与偏向锁
- 偏向锁与轻量级锁
- 深入理解JVM——轻量级锁和偏向锁
- 偏向锁,轻量级锁,重量级锁
- 偏向锁,轻量级锁,重量级锁
- 对象监视器锁、轻量级锁、偏向锁
- 偏向锁、轻量级锁、重量级锁
- 偏向锁,轻量级,重量级锁的理解
- 浅谈Java里的三种锁:偏向锁、轻量级锁和重量级锁
- Java中的锁机制(偏向锁、轻量级锁、重量级锁)
- 《偏向锁,轻量级锁,重量级锁》优缺点对比
- 对象监视器锁 轻量级锁 偏向锁 详解
- 乱弹java并发(七)-- 轻量级锁、偏向锁
- Java线程并发中常见的锁--自旋锁 偏向锁 轻量级锁 轻量级锁
- java 中的锁 -- 偏向锁、轻量级锁、自旋锁、重量级锁
- git commit --amend两种用法
- MindManager盘点——舌尖上的中国
- 解决编译ROS节点时出现的问题 Error: package 'chapter2_tutorials' not found
- jstack调试结果CPU使用过高的问题
- Android UI基础java代码基础点
- 轻量级锁和偏向锁
- 每天研究一个产品,阿德老师“手摸手”带你写产品分析报告 |
- c
- Android发送一个通知到状态栏去
- Vue——组件
- 相关JQuery函数封装
- 如何做好一条0~2岁的产品狗
- 产品经理一定要理解数据
- 深度解读「楼下100」撬动下午茶市场 |手摸手产品研究院