并发编程:等待/通知机制
wait & notify/notifyAll
通过之前的文章,https://www.cnblogs.com/fcb-it/p/13282740.html 我们已经知道了重量级锁会存在等待队列和阻塞队列,这两个队列是做什么用的呢?
阻塞队列:BLOCKED状态的线程会在该队列,当发现锁可用时,线程有机会获取锁,一般线程没抢到锁就会进入该队列
等待队列:该队列的线程不会去尝试获取锁,只有持有锁的对象调用了notifyAll()方法以后,队列中的线程会全部加入到阻塞队列,此时线程才真正有获取锁的可能。调用了WAIT()方法的线程会进入该队列。
wait()方法会释放锁,并进入等待队列。释放锁意味着wait()方法必须在同步方法、代码块中,不持有锁就无法释放锁。
notify()也必须在同步方法、代码块中,因为通知需要唤起当前锁的等待队列中的一个线程,但是notify()不会释放锁,
这意味着通知不会立即让被通知的线程执行,而是将线程从等待队列进入阻塞队列,等到线程真正执行完代码块释放锁时,阻塞队列中的线程才有机会获取到锁。
notify()方法通常不确定能唤醒哪个线程,一般使用notifyAll()方法。