简介
在JVM中,每个对象都与一个Monitor关联。
如果某块资源需要只允许单个线程进行访问,在操作系统中我们可以使用信号量来解决这个问题,但是并不是很方便,所以JVM为我们封装了这个操作,自动化的处理这件事情。Monitor对象如下图所示:
image.png
可以看到分三个区域:
-
Special Room代表正在执行的线程,该区域只允许一个线程进入 -
Wait Set代表等待唤醒的线程集合 -
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











网友评论