注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

zorksylar

Nothing is impossible , if distributed.

 
 
 

日志

 
 

【JVM】【Thread Synchronization】Mointors  

2012-07-10 11:01:24|  分类: java |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
Monitor 是一个Java用作支持线程同步到一个机制。

Monitor支持两种类型的线程同步:互斥(mutual exclusion)和同步(cooperation)。
Monitor可以理解为一个大房子,包含一个特殊的room,这个room一次只能有一个thread进去。这个room里放的就是各个thread互斥的data,这个room就是临界区。

enter the monitor :进入大房子
acquire the monitor :请求获得special room
own the monitor :拥有这个special room
release the monitor :离开这个special room
exiti the monitor : 离开这个大房子

     Monitor里面包含一段代码,叫做monitor regions(就是上面提到的special room), monitor regions 的代码是原子的,并且只能被一个线程执行,只有当这个线程acquire the monitor 之后才能执行这个monitor regions.

Mutual Exclusion
     在special room门口有个entry set,当special room被占用的时候,其他thread只能wait在entry set里,当占用special room的thread离开的时候 ,在entry set中的thread会进行PK,来决定谁进入special room。进入special room后执行monitor regions的代码,release monitor,离开。

上面描述的是线程互斥的情况,当多个线程共用一段代码或者其他数据资源的时候,采用线程互斥来解决问题。通常当多个线程没有共享的资源的时候不需要用线程互斥。那是不是就说如果两个线程如果没有共享的数据资源就不需要互斥了?
当有一个优先级较高的线程(高到不能被block住)将会影响优先级较低的线程,即使他们没有共享的资源,因为优先级较高的线程将会独占CPU,在这种情况下,Monitor能够保证每个线程都分配到一定的CPU时间,及时没有共享的数据资源。

Cooperation
     同步操作的monitor在JVM中叫做 Wait and Notify Monitor, 在这种monitor中,当前own the monitor的thread能够通过一个Wait 命令将自己暂停,当一个thread执行了Wait 命令,它将 release the monitor 并且进入wait set,这个线程将在wait set中保持suspended,直到其他的在monitor内部的线程执行了notify。

以上两个操作能够通过下图很好的解释:
【JVM】【Thread Synchronization】Mointors - sylareclipse - zorksylar
 注意:如果之前的monitor owner 在释放monitor之前没有执行notify,那么只有Entry set的thread竞争获得monitor。
如果之前的monitor owner在释放monitor之前执行了notify,那么 Entry set 和 Wait set的thread将会PK争夺monitor。
一个thread只有在own monitor的时候才能执行Wait命令,在Wait set中的thread只有在own monitor之后才能够离开Wait set。

在JVM中,thread能够给Wait命令传一个timeout参数,表示Wait的时间长度,如果在timeout到的时候没有其他thread给这个thread发出Notify命令,那么,这个thread将会接收到JVM发出的一个的Notify,并占有monitor。

Notify VS NotifyAll
Notify  wakes (any) one thread in the wait set & entry set, NotifyAll  wakes all threads in the wait set & entry set.

Tobe continued....

Reference:

  评论这张
 
阅读(89)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018