JVM学习(三)

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

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

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

JVM学习(三)_第1张图片

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

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

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

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

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

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

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

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

 

你可能感兴趣的:(JVM学习(三))