解锁Java并发编程:深入synchronized关键字
Synchronized 实现同步的基础:
- Java 中的每一个对象都可以视作为锁,具体表现为:
- 对于普通方法,锁是当前实例对象
- 对于静态同步方法,锁是当前类的 Class 对象
- 对于同步方法块,锁是 Synchonized 括号里配置的对象
- 当一个线程试图访问同步代码块时,它首先必须得到锁,退出或抛出异常时必须释放锁
Synchronized 实现原理:
- JVM 基于进入和退出 Monitor 对象来实现方法同步和代码块同步
- 代码块同步:时使用 monitorenter 和 monitorexit 指令来实现的
- 方法同步:没有详细说明,但是可以使用这两个指令来实现
- monitorenter 指令:在编译后插入到同步代码块的开始位置
- monitorexit 指令:是插入到方法结束和异常处
- JVM 要保证每个 monitorenter 必须有对应的 monitorexit 与之匹配
- 任何对象都有一个 monitor 与之关联,当且一个 monitor 被持有后,它将处于锁定状态
- 线程执行到 monitorenter 指令时,将会尝试获取对象所对应的 monitor 的所有权,即尝试获得对象的锁
Java 对象头:
- synchronized 用的锁存在 Java 对象头里
- 如果对象是数组类型,则虚