042_notify() 和 notifyAll() 有什么区别?

如果线程调用了对象的 wait() 方法,那么线程便会处于该对象的等待池中,等待池中的线程不会去竞争该对象的锁。

  1. 当有线程调用了对象的 notifyAll() 方法 (唤醒所有 wait 线程) 或 notify() 方法 (只随机唤醒一个 wait 线程) ,被唤醒的的线程便会进入该对象的锁池中,锁池中的线程会去竞争该对象锁。也就是说,调用了 notify() 后只有一个线程会由等待池进入锁池,而 notifyAll() 会将该对象等待池内的所有线程移动到锁池中,等待锁竞争。
  2. 优先级高的线程竞争到对象锁的概率大,假若某线程没有竞争到该对象锁,它还会留在锁池中,唯有线程再次调用 wait() 方法,它才会重新回到等待池中。而竞争到对象锁的线程则继续往下执行,直到执行完了 synchronized 代码块,它会释放掉该对象锁,这时锁池中的线程会继续竞争该对象锁。

你可能感兴趣的:(多线程)