问题描述
- 多线程IllegalMonitorStateException 很简单的代码,感觉没错啊!
-
public class Test implements Runnable { Mysynchronized syn=null; static Boolean b=true; public Test(Mysynchronized syn) { this.syn=syn; } public static void main(String[] args) { Mysynchronized syn=new Mysynchronized(); new Thread(new Test(syn),"xx").start(); new Thread(new Test(syn),"yy").start(); } @Override public void run() { while (true) { synchronized (syn) { System.out.println(Thread.currentThread().getName()); if(b){ b=false; try { wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.getMessage(); } }else { b=true; notify(); } } } } }
运行结果如下:xx
Exception in thread "xx" Exception in thread "yy" yy
java.lang.IllegalMonitorStateException
at java.lang.Object.notify(Native Method)
at the_eight_chapter.Test.run(Test.java:30)
at java.lang.Thread.run(Unknown Source)
java.lang.IllegalMonitorStateException
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Unknown Source)
at the_eight_chapter.Test.run(Test.java:23)
at java.lang.Thread.run(Unknown Source)
解决方案
wait和notify 方法调用的不对,在前面加上syn就可以了。
切记wait和notify是针对特定对象的。
public class Test implements Runnable {
Mysynchronized syn = null;
static Boolean b = true;
public Test(Mysynchronized syn) {
this.syn = syn;
}
public static void main(String[] args) {
Mysynchronized syn = new Mysynchronized();
new Thread(new Test(syn), "xx").start();
new Thread(new Test(syn), "yy").start();
}
@Override
public void run() {
while (true) {
synchronized (syn) {
System.out.println(Thread.currentThread().getName());
if (b) {
b = false;
try {
syn.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.getMessage();
}
} else {
b = true;
syn.notify();
}
}
}
}
}
解决方案二:
这会死锁吧
synchronized (syn) {
System.out.println(Thread.currentThread().getName());
if(b){
b=false;
try {
wait();//进了这里,进入了wait,run方法没有执行完,其他线程都进不了run的这段代码,该线程无法唤醒。
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.getMessage();
}
}else {
b=true;
notify();
}
}
时间: 2024-05-19 18:31:25