通常来说,可能同一时刻获取到两个对象这个条件很难以满足,那么会采取,在获取失败后,释放掉手上的资源然后进入阻塞,等待别人通知可以重新获取资源的时候再次尝试获取到这个资源
那么关于Java语言的等待-通知机制,是如何支持的
通过synchronized 配合 wait()、notify()、notifyAll() 进行实现
具体的实现思路如下
只有一个线程能进行执行,其他的线程都在等待队列中
调用wait()方法,并且保存在等待队列
Java对象中的notify()和notifyAll()用于在这个线程执行完成后,去进行通知等待队列的方法
告诉等待队列中的线程,告诉其条件曾经满足过
这个曾经满足过是因为,notify()只保证在通知时间点的时候,条件是满足的,但是等真正去获取的时候,条件说不定已经被其他线程拿到了
而且要注意,wait和notify的对应关系,如果this.wait对应this.notify,而且在synchronized中的wait不能再调用
不然会出现一个java.lang.IllegalMonitorStateException。
关于这样的代码,有一个范式,在编写相关代码的时候
直接使用即可
while(条件不满足) {
wait(); } |
而且在开发过程中,尽量的使用notifyAll()
因为直接使用notify()会随机的通知等待队列中的一个线程,而notifyAll()则会通知所有等待的线程
这也是为了避免有些线程永远不会被通知到的可能性
这也是为了避免有些线程拿到的东西并不是本应该拿到的
对于notify的使用时机,则是在满足
所有的等待线程拥有相同的等待条件的情况下
所有的线程被唤醒了,执行相同操作 只需要唤醒一个线程 |