Java中notify()和notifyAll()之间的区别

notify和notifyAll都是线程类的方法,用于为线程提供通知。但是这两种方法之间存在一些显着差异,我们将在下面讨论。

以下是notify和notifyAll之间的重要区别。

序号通知notifyAll
1通知如果是multiThreadingnotify()方法,则将通知仅发送到多个等待锁定的等待线程中的一个线程。notifyAll()在相同上下文中的方法将通知发送给所有等待线程,而不是单个线程。
2线程识别与通知的情况一样,该通知将发送到多个等待线程中的单个线程,因此可以确保那些等待线程中的哪个将接收该锁。另一方面,notifyAll向所有等待的线程发送通知,因此尚不清楚哪个线程将接收该锁。
3风险因素在使用notify()方法的情况下,线程丢失的风险很高,因为仅向单个线程发送通知,而如果错过了发送通知,则其他线程将不会收到任何通知,因此没有锁。如果使用notifyAll,因为通知是所有等待线程的通知,因此如果有任何线程错过了通知,则还有其他线程可以执行此工作,因此风险较小。
4性能与将通知发送到单个线程相比,与notifyAll相比,内存和CPU的消耗更少,因此与notifyAll相比,性能更好。另一方面,由于没有通知的成本降低了,并且通知被发送到所有等待线程,因此与通知相比,内存和CPU消耗更多,因此notifyAll的性能会降低。
5可互换在该notify()方法的情况下,图片中只有一个线程,因此没有线程可互换的概念。虽然我们应该去notifyAll(),如果你所有的等待线程可以互换(他们醒来doesnâTM顺序牛逼事)。

notify与notifyAll的示例

线程A.java

示例

public class ThreadA {
   public static void main(String[] args){
      ThreadB b = new ThreadB();
      b.start();
      synchronized(b){
         try{
            System.out.println("Waiting for b to complete...");
            b.wait();
         }
         catch(InterruptedException e){
            e.printStackTrace();
         }
         System.out.println("Total is: " + b.total);
      }
   }
}
class ThreadB extends Thread{
   int total;
   public void run(){
      synchronized(this){
         for(int i=0; i<100 ; i++){
            total += i;
         }
         notify();
      }
   }
}

输出结果

Waiting for b to complete...
Total is: 4950