通常来说,可能同一时刻获取到两个对象这个条件很难以满足,那么会采取,在获取失败后,释放掉手上的资源然后进入阻塞,等待别人通知可以重新获取资源的时候再次尝试获取到这个资源

那么关于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的使用时机,则是在满足

所有的等待线程拥有相同的等待条件的情况下

所有的线程被唤醒了,执行相同操作

只需要唤醒一个线程

发表评论

邮箱地址不会被公开。 必填项已用*标注