Java中线程锁问题,拜托了。

请问不能编译通过原因是什么呢?
还有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();
    }

}
  • 调用wait就会把当前线程放到条件队列上并阻塞,表示当前线程执行不下去了,它需要等待一个条件,这个条件它自己改变不了,需要其他线程改变。当其他线程改变了条件后,应该调用Object的notify方法
  • wait()和notify()方法的调用必须具有内置锁 synchronized(this) 的代码块内或同步方法中调用才会不抛出IllegalMonitorStateException异常

你的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锁的对象必须一致的。