简介
在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分别访问如下代码块。
那么在Monitor中的扭转是这样的:
首先Thread1
进入Synchronized
代码块,首先会进入Entry Set
区域,被CPU调度选中后会在Special Room
开始执行wait()
方法,此操作会释放锁并进入Wait Set
区域。
接着Thread2
进入Entry Set
被CPU调度选中后进入Synchronized
代码块,执行Wait后 同样进入Wait Set区域,如下图:
参考资料
https://www.programcreek.com/2011/12/monitors-java-synchronization-mechanism/
https://medium.com/swlh/difference-between-java-monitor-and-lock-4677c1b6715f
网友评论