JVM学习(三)

JVM学习(三)——线程同步

Java所使用的同步 机制是监视器(Monitor)。

下面是监视器的模型,我用画图绘的,大家凑合着看,呵呵。。


对上面 这个图做个简单的说明 吧:一个线程想要获得某个监视器时,如果这个监视器已经被其它的线程所持有,那么它会被安排在入口处等待;当一个持有监视器的线程执行一个等待(wait)命令后,它就会释放该监视器而进入等待区,这时候入口处与等待区的(如果执行了唤醒命令)线程就会竞争来获取监视器的持有权。

Java中的监视器主要支持两种线程:

  • 互斥:JVM通过对象锁来实现互斥
  • 协作:通过Object类的 wait方法和notify/notiryAll方法来实现

监视区域:对于一个监视器来说,监视区域是最小的,不可分割的代码块。在同一个监视器中,监视区域 只会同时被一个线程执行。

对象锁:在虚拟机中,每个对象和类都在逻辑上都 是和一个monitor相关联的。为了实现监视器的排他性监视能力,java虚拟机为每一个对象和类都关联一个锁。“锁住一个对象”就是获取相关联的监视器。

一个线程可以对同一个对象多次上锁,对于每一个对象,虚拟机都 维护一个计数器来记录对象被锁的次数。没有被锁的对象计数为0,每加锁一次计数加1,每释放锁一次计数就减1,当计数跳为0的时候,锁就被完全释放了。

下面说一些协作线程应该注意的点:

  • 在一个线程notify以后,它还会继续持有monitor并继续执行监视区域,直到它释放 monitor,等待线程才有可能苏醒。
  • 一个线程只有在它持有的monitor时才能执行等待命令。
  • notify随意从等待区选择一个线程并将其标志为“可能苏醒”,而notiryAll将等待区所有线程都标志为“可能苏醒”。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值