Java Monitors

2020-04-02  本文已影响0人  炎族族长炎天帝

简介

在JVM中,每个对象都与一个Monitor关联。

如果某块资源需要只允许单个线程进行访问,在操作系统中我们可以使用信号量来解决这个问题,但是并不是很方便,所以JVM为我们封装了这个操作,自动化的处理这件事情。Monitor对象如下图所示:

image.png

可以看到分三个区域:

  1. Special Room 代表正在执行的线程,该区域只允许一个线程进入
  2. Wait Set代表等待唤醒的线程集合
  3. Entry Set 获取锁失败而等待的线程集合

举个栗子

        synchronized (Object.class){
            //log
            System.out.println("hellowold");
            Object.class.wait();
        }

synchronized代码块中使用了Object的class对象里面的Minitor,我们可以假设现在两个线程T1和T2分别访问如下代码块。

image.png

那么在Monitor中的扭转是这样的:

首先Thread1进入Synchronized代码块,首先会进入Entry Set区域,被CPU调度选中后会在Special Room开始执行wait()方法,此操作会释放锁并进入Wait Set区域。

image.png

接着Thread2进入Entry Set被CPU调度选中后进入Synchronized代码块,执行Wait后 同样进入Wait Set区域,如下图:

image.png

参考资料

https://www.programcreek.com/2011/12/monitors-java-synchronization-mechanism/

https://medium.com/swlh/difference-between-java-monitor-and-lock-4677c1b6715f

上一篇下一篇

猜你喜欢

热点阅读