标签:请求 执行 moni 关联 必须 之间 逻辑 java程序 状态
本文主要讨论Java中"对象监视器Monitor"和"对象锁"区别
简短的答案是,锁为实现监视器提供必要的支持。
监视器是一种同步结构,它允许线程同时互斥(使用锁)和协作,即使用等待集(wait-set)使线程等待某些条件为真的能力。
在JVM的规范中,有这么一些话很好的总结了锁和监视器之间的关系:
“在JVM中,每个对象和类在逻辑上都是和一个监视器相关联的, 为了实现监视器的排他性监视能力,JVM为每一个对象和类都关联一个锁”
“锁住了一个对象,就是获得对象相关联的监视器, 监视器好比一做建筑,它有一个很特别的房间,房间里有一些数据,而且在同一时间只能被一个线程占据,进入这个建筑叫做"进入监视器",进入建筑中的那个特别的房间叫做"获得监视器",占据房间叫做"持有监视器",离开房间叫做"释放监视器",离开建筑叫做"退出监视器".
java虚拟机中的一个线程在它到达监视区域开始处的时候请求一个锁.JAVA程序中每一个监视区域都和一个对象引用相关联.
所以对于wait()方法的调用:
当前线程必须拥有此 对象监视器,即有该对象的锁。该线程发布对此监视器的所有权并等待 ,直到其他线程通过调用 notify
方法,或 notifyAll
方法通知在此对象的监视器上等待的线程醒来。 然后该线程将等到重新获得对监视器的所有权(即获得锁)后才能继续执行。
对于某一个参数的版本,实现中断和虚假唤醒是可能的,而且此方法应始终在循环中使用:
synchronized (obj) {
while (<condition does not hold>)
obj.wait();
// Perform action appropriate to condition
}
此方法只应由作为此对象监视器的所有者的线程来调用。
抛出:
IllegalMonitorStateException
- 如果当前线程不是此对象监视器的所有者。
InterruptedException
- 如果在当前线程等待通知之前或者正在等待通知时,任何线程中断了当前线程。在抛出此异常时,当前线程的中断状态
被清除。
标签:请求 执行 moni 关联 必须 之间 逻辑 java程序 状态
原文地址:https://www.cnblogs.com/anzhaochong/p/10955233.html