为什么wait和notify函数在同一类锁上不能正常工作?
请查看下面的代码,了解等待和通知功能及其输出。
输出:
Thread-1
Thread-2
Thread-2 after notify预期结果:
Thread-1
Thread-2
Thread-2 after notify
Thread-1 after wait 代码:
public class WaitAndNotify1 {
public static void main(String[] args) {
Thread t1=new Thread(new Runnable(){
@Override
public void run(){
System.out.println("Thread-1");
try {
synchronized (this) {
wait();
System.out.println("Thread-1 after wait");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
Thread t2=new Thread(new Runnable(){
@Override
public void run(){
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread-2");
synchronized (this) {
notify();
System.out.println("Thread-2 after notify");
}
}
});
t1.start();
t2.start();
}
}发布于 2016-06-07 15:32:17
您正在使用来自匿名内部类的this -因此它引用了该匿名内部类的实例。有两个不同的实例(来自不同的匿名内部类),所以您在一个不同于调用notify()的对象上调用wait()。
您目前实际上还没有要同步的WaitAndNotify1实例。您可以将代码移到一个实例方法中,然后使用WaitAndNotify1.this来引用该实例--在这一点上您将获得预期的输出:
public class WaitAndNotify1 {
public static void main(String[] args) {
new WaitAndNotify1().test();
}
public void test() {
Thread t1=new Thread(new Runnable(){
@Override
public void run(){
System.out.println("Thread-1");
try {
synchronized (WaitAndNotify1.this) {
WaitAndNotify1.this.wait();
System.out.println("Thread-1 after wait");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
Thread t2=new Thread(new Runnable(){
@Override
public void run(){
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread-2");
synchronized (WaitAndNotify1.this) {
WaitAndNotify1.this.notify();
System.out.println("Thread-2 after notify");
}
}
});
t1.start();
t2.start();
}
}https://stackoverflow.com/questions/37672929
复制相似问题