请问不能编译通过原因是什么呢?
还有obj.wait();是什么意思呢?
obj是一个线程吗?
public class Test {
private Object obj = new Object();
public synchronized void a() {
try {
obj.wait();
System.out.println("waiting");
} catch (InterruptedException e) {
System.out.println("Exception");
}
}
public static void main(String[] args) {
new Test().a();
}
}
你的a()方法上没加static,锁住的是调用的对象 也就是你创建的new Test()这个对象
然后你再让这个对象里面的obj对象等待之前要尝试获得对象锁
private Object obj = new Object();
public synchronized void a() {
synchronized (obj) {
try {
obj.wait();
System.out.println(Thread.currentThread().getName() + "\twaiting");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Test test = new Test();
new Thread(() -> {
try { Thread.sleep(1000);} catch (InterruptedException e) { e.printStackTrace();}
synchronized (test.obj) {
test.obj.notify();
}
}, "myThread_01").start();
test.a();
}
main waiting
wait 和 notify 是 Java 的内置锁,这两个的方法使用是有限制的:
wait 方法的场景和限制条件:
1 一个具有拥有 Object 锁对象的线程,才能调用该方法
2 该方法将导致当前线程阻塞
3 线程结束阻塞的条件是,另一个线程调用了 notify/notifyAll 唤醒方法,或者等待指定的时间后,自动唤醒自己
详细可参考:https://blog.csdn.net/wojiushiwo945you/article/details/102759506
synchronized同步锁定的对象是Test实例,而wait释放的对象是obj,不是同一个对象实例,所以报错,就是wait释放的锁对象要和synchronized锁的对象必须一致的。