0%

java | synchronized 原理

探究 synchronizedMonitor 的关系。

Monitor 被翻译成监视器或者管程。

每个 Java 对象都可以关联一个 Monitor 对象,如果使用 synchronized 给对象上锁(重量级)之后,该对象头 Mark Word 中就会被设置只想 Monitor 对象的指针。

Monitor 结构

  • Monitor 是操作系统的对象,开始的时候,MonitorOwnernull
  • Thread-1 执行 synchronized(obj) 将会把 Monitor 所有者 owner 设置为 Thread-1 ,Monitor 中只有一个 Owner
  • Thread-1 上锁后,如果 Thread-3Thread-4 也来执行 synchronized(obj),机会进入到 EntryList blocked
  • Thread-1 执行完同步代码块的内容,然后唤醒 EntryList 中等待的线程来竞争锁,竞争时是非公平的
  • Thread-5Thread-6 是之前已经获得过锁的线程,但条件不满足进入 waiting 状态的线程

注意

  • synchronized 必须是进入同一个对象的 Monitor 才有上述效果
  • 注意上述是重量级锁的过程
请我喝杯咖啡吧~