一个工作七年的小伙伴,居然不晓得”wait”和“notify”为什么要在 Synchronized 代码块外面。
好吧,如果屏幕前的你也不晓得,请在评论区打上”不晓得“。
对于这个问题,咱们来看看普通人和高手的答复。
普通人:
额。。。。。。。。。。。。
高手:
- wait 和 notify 用来实现多线程之间的协调,wait 示意让线程进入到阻塞状态,notify 示意让阻塞的线程唤醒。
- wait 和 notify 必然是成对呈现的,如果一个线程被 wait()办法阻塞,那么必然须要另外一个线程通过 notify()办法来唤醒这个被阻塞的线程,从而实现多线程之间的通信。
-
在多线程外面,要实现多个线程之间的通信,除了管道流以外,只能通过共享变量的办法来实现,也就是线程 t1 批改共享变量 s,线程 t2 获取批改后的共享变量 s,从而实现数据通信。
然而多线程自身具备并行执行的个性,也就是在同一时刻,多个线程能够同时执行。在这种状况下,线程 t2 在访问共享变量 s 之前,必须要晓得线程 t1 曾经批改过了共享变量 s,否则就须要期待。
同时,线程 t1 批改过了共享变量 S 之后,还须要告诉在期待中的线程 t2。
所以要在这种个性下要去实现线程之间的通信,就必须要有一个竞争条件控制线程在什么条件下期待,什么条件下唤醒。
- 而 Synchronized 同步关键字就能够实现这样一个互斥条件,也就是在通过共享变量来实现多个线程通信的场景外面,参加通信的线程必须要竞争到这个共享变量的锁资源,才有资格对共享变量做批改,批改实现后就开释锁,那么其余的线程就能够再次来竞争同一个共享变量的锁来获取批改后的数据,从而实现线程之前的通信。
- 所以这也是为什么 wait/notify 须要放在 Synchronized 同步代码块中的起因,有了 Synchronized 同步锁,就能够实现对多个通信线程之间的互斥,实现条件期待和条件唤醒。
- 另外,为了防止 wait/notify 的谬误应用,jdk 强制要求把 wait/notify 写在同步代码块外面,否则会抛出 IllegalMonitorStateException
- 最初,基于 wait/notify 的个性,非常适合实现生产者消费者的模型,比如说用 wait/notify 来实现连接池就绪前的期待与就绪后的唤醒。
以上就是我对 wait/notify 这个问题的了解。
总结
这个是一个典型的经典面试题。
其实考查的就是 Synchronized、wait/notify 的设计原理和实现原理。
因为 wait/notify 在业务开发整简直不怎么用到,所以大部分人答复不进去。
其实并发这块内容实践上来说所有程序员都应该要懂,不论是它的利用价值,还是设计理念,十分值得学习和借鉴。
本期的普通人 VS 高手面试系列就到这里完结了,喜爱的敌人记得点赞和珍藏。
另外,有任何技术上的问题,职业倒退无关的问题,都能够私信我,我会在第一工夫回复。
版权申明:本博客所有文章除特地申明外,均采纳 CC BY-NC-SA 4.0 许可协定。转载请注明来自
Mic 带你学架构
!
如果本篇文章对您有帮忙,还请帮忙点个关注和赞,您的保持是我一直创作的能源。欢送关注同名微信公众号获取更多技术干货!