解锁Java并发编程:深入synchronized关键字

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