java原语wait、notify和notifytoall的正确理解
1115
2022.07.10
2022.07.10
发布于 未知归属地

前言

需要注意的是:wait() 、 notify()、notifyAll() 这三个方法的调用者 都应该是同步锁对象,如果这三个方法的调用者不是同步锁对象,JVM 会报 IllegalMonitorStateException 的异常。

  • IllegalMonitorStateException 的异常表示 当前的线程不是此对象监视器的所有者。
  • 当前线程要锁定该对象之后,才能用锁定的对象执行这些方法,这里需要用到synchronized关键字,锁定哪个对象就用哪个对象来执行notify(), notifyAll(),wait(), wait(long), wait(long, int)操作,否则就会报IllegalMonitorStateException异常。

锁定方法所属的实例对象:

public synchronized void method(){
    //然后就可以调用:this.notify()...
    //或者直接调用notify()...
}

锁定方法所属的实例的Class

public Class Test{
 public static synchronized void method(){
    //然后调用:Test.class.notify()...
 }
}

锁定其他对象:

public Class Test{
public Object lock = new Object();
 public static void method(){
    synchronized (lock) {
     //需要调用 lock.notify();
    } 
 }
}

关于java原语wait、notify和notifytoall说法正确的是?(C)

A、在同步快外使用wait(timeout)其效果和sleep(timeout)是一样的
B、notifyAll唤醒了所有因wait等待的线程,这些线程将并发
C、notifyALL消耗的CPU资源比notify多
D、进入wait状态的线程,只可能被notify或notifyAll唤醒

解释:

  • D:wait() 让当前线程处于“等待(阻塞)状态”,“直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法”,当前线程被唤醒(进入“就绪状态”)。
    public final void wait() throws InterruptedException {
        this.wait(0L);
    }
  • wait(long timeout) 让当前线程处于“等待(阻塞)状态”,“直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量”,当前线程被唤醒(进入“就绪状态”)。
public final native void wait(long var1) throws InterruptedException;
  • wait(long timeout, int nanos) 让当前线程处于“等待(阻塞)状态”,“直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量”,当前线程被唤醒(进入“就绪状态”)。
public final void wait(long var1, int var3) throws InterruptedException {
        if (var1 < 0L) {
            throw new IllegalArgumentException("timeout value is negative");
        } else if (var3 >= 0 && var3 <= 999999) {
            if (var3 > 0) {
                ++var1;
            }

            this.wait(var1);
        } else {
            throw new IllegalArgumentException("nanosecond timeout value out of range");
        }
    }
评论 (0)