Java监控机制使用方法解析

  

<强>监控概念
  

  

管程,监视器。在操作系统中,存在着信号灯和互斥,即信号量和互斥量,使用基本的互斥锁进行开发时,需要小心的使用互斥的下降和上升操作,否则容易引发死锁问题。为了更好的编写并发程序,在互斥锁和信号量基础上,提出了更高层次的同步原语,实际上,监视属于编程语言的范畴,C语言不支持监视器,而java支持监控机制。

  

一个重要特点是,在同一时间,只有一个线程/进程能进入监控所定义的临界区,这使得监控能够实现互斥的效果。无法进入监控的临界区的进程/线程,应该被阻塞,并且在适当的时候被唤醒。显然,监控作为一个同步工具,也应该提供这样管理线程/进程的机制。

  

监控这个机制之所以被称为:更高级的原语,它不可避免的需要对外屏蔽这些机制,并且在内部实现这些机制,使得监测成为一个简洁易用的借口。

  

监测基本元素
  

  
      <李>临界区李   <李>监控对象和锁李   <李>条件变量以及定义在监控对象上的等等,信号操作李   
  

使用监控主要是为了互斥进入临界区,为了能够阻塞无法进入临界区的进程,线程,需要一个监控对象来协助,这个对象内部会有相应的数据结构,例如列表,用来保存被阻塞的线程;同时由于监控机制本质是基于互斥锁原语的,所以对象必须维护一个基于互斥锁的锁。

  

此外,为了在适当的时候能够阻塞和唤醒进程/线程,还需要引入一个条件变量,这个条件变量用来决定什么时候是“适当的时候”,这个条件可以来自程序代码的逻辑,也可以是在监控对象的内部,总而言之,程序员对条件变量的定义有很大的自主性。不过,由于监控对象内部采用了数据结构来保存被阻塞的队列,因此它也必须对外提供两个API来让线程进入阻塞状态以及之后被唤醒,分别是等待和通知。

  

<强>监控在java中的实现
  

  

<强>临界区的圈定
  

  

被同步关键字修饰的方法,代码块,就是监控机制的临界区

  

<强>监控对象/强>
  

  

在上述同步关键字被使用时,往往需要指定一个对象与之关联,例如同步(这),总之,同步需要管理一个对象,这个对象就是监控对象。

  

监控机制中,监视我不检测题充当着维护互斥和等待,signalAPI来管理线程的阻塞和唤醒。

  

Java对象存储在内存中,分别分为三个部分,即对象头,实例数据和对齐填充,而在其对象头中,保存了锁标识;同时,. lang。对象类定义了wait()通知(),notifyAll()方法,这些方法的具体实现,依赖于一个叫ObjectMonitor模式的实现,这是JVM内部基于c++实现的一套机制,基本原理如下所示:

  

 Java监控机制使用方法解析

  

当一个线程需要获取对象的锁时,会被放入EntrySet中进行等待,如果该线程获取到了锁,成为当前锁的所有者。如果根据程序逻辑,一个已经获得了锁的线程缺少某些外部条件,而无法继续进行下去(例如生产者发现队列已满或者消费者发现队列为空),那么该线程可以通过调用等方法将锁释放,进入等设置中阻塞进行等,待其它线程在这个时候有机会获得锁,去干其它的事情,从而使得之前不成立的外部条件成立,这样先前被阻塞的线程就可以重新进入EntrySet去竞争锁。这个外部条件在监控机制中称为条件变量。

  

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

Java监控机制使用方法解析