java基础(多线程)-Monitor概念

一、java对象头

java基础(多线程)-Monitor概念_第1张图片

 java基础(多线程)-Monitor概念_第2张图片

二、Monitor

Monitor被翻译为监视器管程。

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

Monitor结构如下

java基础(多线程)-Monitor概念_第3张图片

  •  刚开始Monitor中Owner为null
  • 当Thread-2执行Synchronized(obj)就会将Monitor的所有者owner置为Thread-2。Monitor中只能有一个Owner。
  • 在Thread-2上锁的过程中,如果Thread-3,Thread-4,Thread-5也来执行Synchronized(obj),就会进入EntryList Blocked。
  • Thread-2执行完同步代码块的内容,然后唤醒EntryList中等待的线程来竞争锁,竞争时是非公平的
  • 图中WaitSet中的Thread-0,Thread-1是之前获得过锁,但条件不满足进入waiting状态的线程,后面讲wait-notify时会分析。
  • 注意:
  • synchronized必须是进入同一个对象的monitor才有上述的效果
  • 不加synchronized的对象不会关联Monitor,不遵从以上规则

你可能感兴趣的:(java)