java中的notify和notifyAll有什么区别?

锁池:

假设线程A已经拥有了某个对象(注意:不是类)的锁,而其它的线程想要调用这个对象的某个synchronized方法(或者synchronized块),由于这些线程在进入对象的synchronized方法之前必须先获得该对象的锁的拥有权,但是该对象的锁目前正被线程A拥有,所以这些线程就进入了该对象的锁池中。锁池中的线程会去竞争该对象锁。

等待池:

假设一个线程A调用了某个对象的wait()方法,线程A就会释放该对象的锁后,进入到了该对象的等待池中,而等待池中的线程不会去竞争该对象的锁。

notifyAll()方法:唤醒所有 wait 线程——等待池内的所有线程移动到锁池中

notify()方法:只随机唤醒一个 wait 线程——只有一个线程会由等待池进入锁池

被唤醒的的线程便会进入该对象的锁池中,锁池中的线程会去竞争该对象锁

唤醒线程——由等待池移动到锁池。

优先级高的线程竞争到对象锁的概率大,假若某线程没有竞争到该对象锁,它还会留在锁池中,唯有线程再次调用 wait()方法,它才会重新回到等待池中。而竞争到对象锁的线程则继续往下执行,直到执行完了 synchronized 代码块,它会释放掉该对象锁,这时锁池中的线程会继续竞争该对象锁。

—————————————————————————————————————————————————————————

notify可能会导致死锁,而notifyAll则不会(why?)

你可能感兴趣的:(java中的notify和notifyAll有什么区别?)