码迷,mamicode.com
首页 > 其他好文 > 详细

【软件构造】第十章

时间:2019-05-31 15:01:51      阅读:100      评论:0      收藏:0      [点我收藏+]

标签:请求   执行   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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!