轻量级锁和偏向锁概述

072601
锁优化:
自旋锁和自适应自旋
锁消除
锁膨胀
轻量级锁
轻量级锁是jdk6时加入的新型锁机制,“轻量”是相对于使用操作系统互斥量来实现的传统锁而言的,
因此传统的锁机制被称为重量级锁。

轻量级锁设计的初衷是在没有多线程竞争的前提下,减少传统的重量级锁使用操作系统互斥量产生的性能消耗。
要理解轻量级锁,以及后面会讲到的偏向锁的原理和运作过程,必须要对HotSpot虚拟机对象的内存布局(尤其是对象头部分)有所了解。

HotSpot虚拟机的对象头分为两部分,第一部分用于存储对象自身的运行时数据,如哈希码、gc分代年龄等,称为markword,这部分是实现轻量级锁和偏向锁的关键。另一部分用于存储指向方法区对象类型数据的指针。

轻量级锁的工作过程:在代码即将进入同步块的时候,如果此同步对象没有被锁定(锁标志位为“01”状态),虚拟机首先将在当前线程的栈帧中建立一个名为锁记录(Lock Record)的空间,用于存储锁对象目前的Mark Word的拷贝。然后,虚拟机将使用CAS操作尝试把对象的Mark Word更新为指向Lock Record的指针。如果这个更新动作成功了,即代表该线程拥有了这个对象的锁,并且对象Mark Word的锁标志为将转变为“00”,表示此对象处于轻量级锁定状态。如果这个更新操作失败了,那就意味着至少存在一条线程与当前线程竞争获取该对象的锁。

轻量级锁能提升程序同步性能的依据是“对于绝大部分的锁,在整个同步周期内都是不存在竞争的”,这一经验法则。
如果没有竞争,轻量级锁便通过CAS操作成功避免了使用互斥量的开销;但如果确实存在锁竞争,除了互斥量的本身开销外,还额外发生了CAS操作的开销,因此在有竞争的情况下,轻量级锁反而会比传统的重量级锁更慢。

总结:轻量级锁是jdk6时加入的新型锁机制,其设计的初衷是减少传统的重量级锁因使用操作系统互斥量产生的性能消耗。
轻量级锁能提升程序同步性能的依据是“对于绝大部分的锁,在整个同步周期内都是不存在竞争的”,这一经验法则。
如果没有竞争,轻量级锁便通过CAS操作成功避免了使用互斥量的开销;

偏向锁
轻量级锁是在无竞争的情况下使用CAS操作去消除同步使用的互斥量,偏向锁是在无竞争的情况下把整个同步都消除掉,
连CAS操作都不去做了。偏向锁会偏向于第一个获得它的线程,如果在接下来的执行过程中,该锁一直没有被其他的线程
获取,则持有偏向锁的线程将永远不需要再进行同步。

偏向锁原理:
当锁对象第一次被线程获取的时候,虚拟机将会把对象头中的偏向模式设置为“1”,表示进入偏向模式。
同时使用cas操作把获得这个锁的线程id记录在对象的mark word之中,如果CAS操作成功,持有偏向锁的线程以后每次进入这个锁相关的同步块时,虚拟机都可以不再进行任何同步操作。

072602
MVCC:多版本并发控制
MVCC是为了解决上面问题?
并发访问(读或写)数据库时,对正在事务内处理的数据做多版本的管理。我们知道锁机制可以用来控制并发操作,但是其系统开销较大。而MVCC可以在大多数情况下代替行级锁,使用MVCC可以降低系统开销。
MVCC实现
MVCC通过保存数据在某个时间点的快照来实现。不同存储引擎的MVCC实现是不同的。当我们创建表之后,mysql会自动为每个表添加数据版本号(最后更新数据的事务id)和删除版本号(数据删除的事务id),事务id由mysql数据库自动生成,且递增。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值