关于java的wait、notify、notifyAll方法

wait、notify、notifyAll

遇到的问题

以前开发打印机项目,由于须要使用多线程技术,当时并不怎么理解,一开始随意在方法体内使用wait、notify、notifyAll 方法致使出现了一大堆 IllegalMonitorStateException 异常。为何会出现这个异常这和这三个方法内部的机制有关。java

同步机制

wait 和 notify 是 java 同步机制中重要组成部分。使用时需结合 synchronized 关键字。 
同步分为类级别和对象级别,分别对应着类锁和对象锁。其实类也能够当作是一个 Class 对象。每一个类只有一个类锁,每一个对象也只有一个对象锁。要想达到同步状态,操做时必须获取对应的对象/类锁,保证其余地方不能同时更改对象/类的状态。多线程

 

关于 wait、notify、notifyAll

  • wait 
    调用wait的时候,线程会释放其占有的对象锁,同时不会主动去申请获取对象锁,必须等待被唤醒的时候,才拥有得到对象锁的权利。
  • notify 
    唤醒在等待该对象同步锁的线程(只唤醒一个,若是有多个对象在等待,并且具备随机性)
  • -notifyAll 
    唤醒全部在等待该对象同步锁的线程,该方法虽然是对每一个wait的线程都调用一次notify,但仍是有顺序的,每一个对象都保存这一个等待对象链,调用的顺序就是这个链的顺序。

注:线程

  调用了wait、notify、notifyAll 方法必须在同步状态,即已获取了对象锁,因此在使用时候必须搭配 synchronized 关键字一块儿用,不然就会抛出 java.lang.IllegalMonitorStateException ,因此以前遇到的问题就是由于在没有保证同步的时候调用了这些方法。 
  notifyAll 虽然能唤醒全部线程,但并非全部线程马上得到执行的机会,由于要得到执行的机会,必须首先得到对象锁,可是同一时刻只有线程可以得到对象锁。因此在调用 notifyAll 方法以后,同一时刻只有一个线程得到执行的机会,其余线程须等待该线程执行完毕释放对象锁才有机会执行 
  这三个方法都属于Object对象,而不属于线程级别,它们的使用都与锁有关对象

相关文章
相关标签/搜索