以前开发打印机项目,由于须要使用多线程技术,当时并不怎么理解,一开始随意在方法体内使用wait、notify、notifyAll 方法致使出现了一大堆 IllegalMonitorStateException 异常。为何会出现这个异常这和这三个方法内部的机制有关。java
wait 和 notify 是 java 同步机制中重要组成部分。使用时需结合 synchronized 关键字。
同步分为类级别和对象级别,分别对应着类锁和对象锁。其实类也能够当作是一个 Class 对象。每一个类只有一个类锁,每一个对象也只有一个对象锁。要想达到同步状态,操做时必须获取对应的对象/类锁,保证其余地方不能同时更改对象/类的状态。多线程
注:线程
调用了wait、notify、notifyAll 方法必须在同步状态,即已获取了对象锁,因此在使用时候必须搭配 synchronized 关键字一块儿用,不然就会抛出 java.lang.IllegalMonitorStateException ,因此以前遇到的问题就是由于在没有保证同步的时候调用了这些方法。
notifyAll 虽然能唤醒全部线程,但并非全部线程马上得到执行的机会,由于要得到执行的机会,必须首先得到对象锁,可是同一时刻只有线程可以得到对象锁。因此在调用 notifyAll 方法以后,同一时刻只有一个线程得到执行的机会,其余线程须等待该线程执行完毕释放对象锁才有机会执行
这三个方法都属于Object对象,而不属于线程级别,它们的使用都与锁有关对象