新手 Java 多线程

假如 A线程 调用了obj.wait() ,之后B线程 调用了obj.wait(),待B线程执行完synchronized(obj)代码块释放 obj锁。此时A线程拿到obj锁 继续运行线程 ,这之后A线程会一直拿着obj锁吗,还是被拿到锁 被唤醒后就 把锁释放了

怎么又是你,A在wait后如果不被notify是不能竞争锁的。锁的所有时间只在synchronized花括号内,花括号内肯定有锁,出去肯定没有,但是锁被释放后执行wait的线程无法获得锁,必须先被别的线程notify才能获取锁

写了一个小例子, 你自己反复运行几次, 试着按你自己的理解去改一改逻辑, 很快你就明白了


import static java.lang.Thread.sleep;

public class ABTest {

    private static  Object obj = new Object();

    private static class ThreadA extends Thread{
        public void run() {
            System.out.println("a started");

            synchronized (obj){
                System.out.println("A do something and then wait");

                obj.notify();
                try {
                    obj.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("a finished");
        }
    }
    private static class ThreadB extends Thread{
        public void run() {
            System.out.println("b started");

            synchronized (obj){
                System.out.println("B do something and then wait");
                try {
                    sleep(100);
                    obj.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                obj.notify();

            }

            System.out.println("b finished");
        }
    }


    public static  void main(String [] args) throws InterruptedException {
        Thread a = new ThreadA();
        Thread b = new ThreadB();
        a.start();
        b.start();

        synchronized (obj) {
            sleep(1000);
            System.out.println("main finished!");
            obj.notify();
        }
    }
}

图片说明