JAVA多线程之wait&notify&notifyAll

本文详细介绍了Java中wait, notify及notifyAll方法的工作原理及其在synchronized代码块中的应用。强调了这些方法必须在已获取对象锁的情况下才能调用,并解释了notifyAll能够唤醒所有处于等待状态的线程,而notify仅唤醒一个随机线程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原理

wait&notify&notifyAll都是java的native的方法。
synchronized代码块通过javap生成的字节码中包含 ** monitorenter ** 和 ** monitorexit **指令。使用这三个API的时候,外面必须调用在synchronized中。
表示线程执行lock.wait()方法时,必须持有该lock对象的monitor,如果wait方法在synchronized代码中执行,该线程很显然已经持有了该对象的monitor。wait方法会将当前线程放入wait set,等待被唤醒,并放弃lock对象上的所有同步声明,意味着线程释放锁。

  • notify方法会选择wait set中任意一个线程进行唤醒;

  • notifyAll方法的注释:notifyAll方法会唤醒monitor的wait set中所有线程。

注意事项

如果先notify/notifyAll,再wait,后面的线程将永远等不到唤起。要在代码中坚决避免。

    public static void main(String[] args) {
        Object o = new Object();
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    synchronized (o){
                        System.out.println("t1 notify");
                        o.notifyAll();
                        System.out.println("t1 after notify");
                    }
                }catch (Exception ex){
                    ex.printStackTrace();
                }
            }
        });

        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(1000);
                    synchronized (o){
                        System.out.println("t2 wait");
                        o.wait();
                        System.out.println("t2 after wait");
                    }
                }catch (Exception ex){
                    ex.printStackTrace();
                }
            }
        });

        t1.start();
        t2.start();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值