首页 > 代码库 > synchronized实现原理
synchronized实现原理
synchronized实现同步的基础:java中每个对象都可以作为锁,如下:
- 对于普通同步方法,锁是当前实例对象
- 对于静态同步方法,锁是当前类的Class对象
- 对于同步方法块,锁是synchronized括号里配置的对象
当一个线程试图访问同步代码块时,它首先必须得到锁,退出或者抛出异常时必须释放锁。
从JVM规范中看到,JVM基于进入和退出的Monitor对象来实现方法同步和代码块同步,使用了monitorenter和monitorexit指令实现的。
Java对象头
synchronized用的锁是存在Java对象头里面的。(剩下太细节,我也不想背,放弃),记住里面有个MARK word,里面存放一些hashcode。
锁的状态
锁一共有四种状态:无锁状态,偏向锁状态,轻量锁状态,重量锁状态。
这四种情况会随着竞争情况逐渐升级,锁可以升级,但不能降级(这种只能升级的锁策略是为了提高获得和释放锁的效率)
锁 | 优点 | 缺点 | 使用场景 |
偏向锁 |
加锁和解锁不需要额外的开销, 执行非同步方法相比仅存在纳秒的差别 |
如果线程间存在锁竞争,会带来额外的锁撤销的消耗 | 只有一个线程访问同步块场景 |
轻量级锁 | 竞争的线程不会阻塞,提高了程序的响应速度 | 如果始终得不到锁竞争的线程,使用自旋会消耗CPU |
追求响应时间 同步块执行速度快 |
重量级锁 | 线程竞争不使用自旋,不消耗CPU | 线程阻塞,响应时间缓慢 |
追求吞吐量 同步块执行时间较长 |
synchronized实现原理
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。