wait()与notify/notifyAll()版权声明

原创
小哥 3年前 (2022-10-28) 阅读数 17 #大杂烩

wait() 与 notify/notifyAll() 是Object类的方法

  1. wait() 与notify/notifyAll方法必须在同步块中使用。

执行上述方法时,必须先获取锁。 。那么你是怎么弄到锁的呢?

使用synchronized关键字获取锁。所以呢,wait() 与  notify/notifyAll() 经常与synchronized使用,

即在synchronized修改后的同步块或方法在内部调用。wait() 与  notify/notifyAll()方法。

  1. wait() 与  notify/notifyAll() 执行过程

前提:只有一个锁,只有一个对象

当线程执行时lock.wait()将释放当前锁,然后将其分发出去。CPU,进入等待状态。

当执行notify/notifyAll方法,一个人被唤醒。/等待对象锁定的所有线程。

package cn.bit13.libra.testWaitNotify;

public class ThreadA extends Thread{ private Object lock; public ThreadA(Object lock){ super(); this.lock= lock; }

@Override
public void run(){
    synchronized (lock){
        try {
            System.out.println("A放弃锁");
            lock.wait();
        }catch(InterruptedException e){

        }
        System.out.println("A重获锁");
    }
}

}

package cn.bit13.libra.testWaitNotify;

public class ThreadB extends Thread{ private Object lock; public ThreadB(Object lock){ super(); this.lock= lock; }

@Override
public void run(){
  synchronized (lock){
      System.out.println("B通知A锁可以重新获得(但必须等待。B执行完)");
       lock.notify();
       System.out.println("B运行完");
    }
}

}

package cn.bit13.libra.testWaitNotify;

public class TestWaitNotify { public static void main(String[] args){ Object lock= new Object(); //锁是一种对象。 Thread a= new ThreadA(lock); a.start(); Thread b= new ThreadB(lock); b.start(); } }

输出:

A放弃锁
B通知A锁可以重新获得(但必须等待。B执行完)
B运行完
A重获锁

  1. notify()通知第一个人wait的进程,notifyAll()通知所有wait的进程
版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除