问题描述:
Exception in thread "Thread-1" Exception in thread "Thread-0" Exception in thread "Thread-2" java.lang.IllegalMonitorStateException
at java.lang.Object.notify(Native Method)
at Window.run(WindowTest.java:30)
java.lang.IllegalMonitorStateException
at java.lang.Object.notify(Native Method)
at Window.run(WindowTest.java:30)
java.lang.IllegalMonitorStateException
at java.lang.Object.notify(Native Method)
at Window.run(WindowTest.java:30)
报错原因:
一、wait(),notify(),notifyAll()只能使用在同步代码块或者同步方法中.
public void run() {
while (true) {
try {
lock.lock();
notify();
if (ticket>0){
System.out.println(getName()+":卖票,票号:" + ticket);
ticket--;
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}else break;
} finally {
lock.unlock();
}
}
}
上述代码将wait和notify放到了lock锁内部,因此抛出上述异常
二、wait(),notify(),notifyAll()的调用者必须是同步代码块或者同步方法的同步监视器(也就是锁).
wait(),notify(),notifyAll()其实是声明在java.lang.Object类中,当我们调用的时候实际上前面省略了"this."
Object obj = new Object();
public void run() {
while (true) {
synchronized(obj) {
notify();
if (ticket>0){
System.out.println(getName()+":卖票,票号:" + ticket);
ticket--;
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}else break;
}
}
}
如上代码虽然使用了同步代码块,但是其同步监视器的对象与this也就是当前对象不一致,同样报错。
解决方案:
public void run() {
while (true) {
synchronized(this) {
notify();
if (ticket>0){
System.out.println(getName()+":卖票,票号:" + ticket);
ticket--;
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}else break;
}
}
}