Java并发编程基础-锁-synchronized状态变换
synchoronized在Jdk1.6之前一直被称为重量锁,性能较差,很少被推荐使用。synchoronized在Jdk1.6中进行了大量优化,性能与JUC中的各种锁无差,也被逐渐的被大众所接受。 synchoronized将锁状态记录在了 对象头的MarkWord 中,包含4种锁状态:无锁、偏向锁、轻量锁和重量锁,锁状态只能升级不能降级,即 无锁-->偏向锁-->轻量锁-->重量锁,目的是提高获取锁和释放锁的效率,对象几种状态的获取和释放如下: 偏向锁 大多数情况下,锁不存在多线程竞争,而总是由同一线程获得,为了让线程获得锁的代价更低( 消除了同步 )而引入了偏向锁。当对象第一次被线程获取的时候,会把MarkWord中的偏向标识位设为01(偏向锁状态),同时使用CAS操作将该线程的ID记录在MarkWord中,如果CAS操作成功,则该线程每次进入到这个锁相关的同步块时,虚拟机都可以不进行任何同步操作。 当有另外的线程获取这个锁时,偏向模式就结束了,根据锁对象目前是否处于锁定的状态,会恢复到无锁状态(01)或者变为轻量锁状态(00),借用《Java并发编程艺术》的一张图,如下所示: 轻量锁 线程在执行同步块之前,JVM会先在当前线程栈帧中创建用于存储锁记录的空间,并将对象头中的MarkWord复制到锁记录中,官方称为 Displaced Mark Word