Java并发编程

Java并发机制底层实现原理-synchronized

2018-04-29  本文已影响61人  markfork

章节目录

synchronized 重量级锁

1.6版本之前 synchronized 被称之为 重量级锁
1.6版本对 synchronized 进行了优化,主要优化的点在于 减少 获得锁和释放锁带
来的性能消耗,为实现这个目的引入了偏向锁、与轻量级锁。 

synchronized 实现同步的基础

Java中每一个对象都可以作为锁。
普通同步方法,锁是当前实例对象。
静态同步方法块,锁是当前类的Class对象。
对于同步方法块,锁是synchronized括号里配置的对象。

synchronized 同步锁的获取 底层原理
如下图所示:

synchronized 同步锁的获取 底层原理.png
synchronized锁的存储位置
synchronized 用的锁是存在java对象头里的。
对象头中的Mark-word 默认存储对象的hashcode、分代年龄、和锁标志位。
Mark-word 中存储的数据会随着锁标志位的变化而变化
轻量级锁-00
重量级锁-10
GC标记-11
偏向锁-01

锁的升级与对比
Java SE 1.6 当中锁一共有4种状态,级别从低到高一次为:无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态。锁可以升级但不能降级,这种锁升级但不能降级的策略,目的是为了提高获得锁与释放锁的效率。

1.偏向锁原理

偏向锁的优点及初始化过程:

偏向锁的撤销:

2.轻量级锁原理

轻量级锁加锁:

轻量级锁解锁

总结

优点 缺点 适用场景
偏向锁 加锁和解锁都不需要额外的消耗,和执行非同步的方法相比只存在纳秒级差距 如果线程间存在锁竞争,会带来额外的锁撤销的消耗 适用于只有一个线程访问同步块的场景
轻量级锁 竞争的线程不会阻塞,提高了应用的相应速率 如果始终得不到竞争的线程,适用自旋会消耗cpu,造成cpu空转 追求响应时间,同步块执行速度非常快
重量级锁 线程竞争不使用自旋,不会消耗cpu 线程阻塞,响应时间缓慢 追求吞吐量,同步块执行速度较长

不同锁的优缺点

优点 缺点 适用场景
偏向锁 加锁和解锁都不需要额外的消耗,和执行非同步的方法相比只存在纳秒级差距 如果线程间存在锁竞争,会带来额外的锁撤销的消耗 适用于只有一个线程访问同步块的场景
轻量级锁 竞争的线程不会阻塞,提高了应用的相应速率 如果始终得不到竞争的线程,适用自旋会消耗cpu,造成cpu空转 追求响应时间,同步块执行速度非常快
重量级锁 线程竞争不使用自旋,不会消耗cpu 线程阻塞,响应时间缓慢 追求吞吐量,同步块执行速度较长
上一篇下一篇

猜你喜欢

热点阅读