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();
}
}