monitor

Java所使用的主要的阻塞同步机制是监视器(monitor)。

这篇文章Inside the Java Virtual Machine | Chapter 20 Thread Synchronization 十分详细地解释了monitor。

Monitor是 Java中用以实现线程之间的互斥与协作的主要手段。 每一个对象有且仅有一个monitor。

一次只有一个线程可占有一个对象的监视器。(摘自JavaDocObject.notify():Only one thread at a time can own an object's monitor.)。

下图是monitor的抽象图(摘自上面链接的文章):

monitor structure

  • 进入区(Entry Set):表示线程通过synchronized要求获取对象的锁。如果对象未被锁住,则进入拥有者;否则则在进入区等待。一旦对象锁被其他线程释放,立即参与竞争。
  • 拥有者(The Owner):表示某一线程成功竞争到对象锁。
  • 等待区(Wait Set):表示线程通过对象的wait方法,释放对象的锁,并在等待区等待被唤醒。

从图中可以看出,一个 Monitor在某个时刻,只能被一个线程拥有,该线程就是 “Active Thread”,而其它线程都是 “Waiting Thread”,分别在两个队列 “ Entry Set”和 “Wait Set”里面等候。 在 “Entry Set”中等待的线程状态是 “Waiting for monitor entry”,而在 “Wait Set”中等待的线程状态是 “in Object.wait()”。 我们称被 synchronized保护起来的代码段为临界区。当一个线程申请进入临界区时,它就进入了 “Entry Set”队列。

monitor相关指令

恩,以上说的可能有点抽象,我们可以想办法近距离观察下monitor的存在。

这是一个含有synchronized块的代码:

public class Monitor {
    public static void main(String[] args) {
        synchronized (Monitor.class) {
            String test = "a";
        }
    }
}
>javap -c Monitor.class
Compiled from "Monitor.java"
public class com.tea.lang.monitor.Monitor {
  public com.tea.lang.monitor.Monitor();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: ldc           #2                  // class com/tea/lang/monitor/Monitor
       2: dup
       3: astore_1
       4: monitorenter
       5: ldc           #3                  // String a
       7: astore_2
       8: aload_1
       9: monitorexit
      10: goto          18
      13: astore_3
      14: aload_1
      15: monitorexit
      16: aload_3
      17: athrow
      18: return
    Exception table:
       from    to  target type
           5    10    13   any
          13    16    13   any
}

关注下这两行

4: monitorenter //进入Monitor.class相关联的那个monitor
//……省略几行
9: monitorexit //退出Monitor.class相关联的那个monitor

如下是JVM规范里两个指令的描述(放出来仅供其他问题的参考,对于帮助理解monitor的概念,作用不大)。

JVM Specification | 6.5.monitorenter

JVM Specification | 6.5.monitorexit

so,由上,可稍微感受到monitor的存在。

references

[1]Inside the Java Virtual Machine | Chapter 20 Thread Synchronization

[2]JavaStuff.in | synchronization

[3]探索 Java 同步机制——Monitor Object 并发模式在 Java 同步机制中的实现

[4]Java Language Specification | 17.1. Synchronization

[5]周志明.深入理解Java虚拟机:JVM高级特性与最佳实践,第2版.中国:机械工业出版社,2013

results matching ""

    No results matching ""