当前位置: 首页 > 后端技术 > Java

【专访普通人VS专家系列】告诉我wait和notify为什么在synchronized代码块里?

时间:2023-04-01 13:24:10 Java

一位工作了七年的小伙伴不知道为什么“等待”和“通知”在Synchronized代码块中。嗯,如果屏幕前的你也不知道,请在评论区写上“不知道”。对于这个问题,我们来看看普通人和专家的回答。普通人:嗯。...........Master:wait和notify用于实现多线程之间的协调,wait是让线程进入阻塞状态,notify是唤醒阻塞线程。等待和通知必须成对出现。如果一个线程被wait()方法阻塞,另一个线程必须通过notify()方法唤醒被阻塞的线程,才能实现多线程间的通信。在多线程中,要实现多个线程之间的通信,除了流水线外,只能通过共享变量的方式来实现,即线程t1修改共享变量s,线程t2获取修改后的共享变量s,从而完成数据通信。但是多线程本身就具有并行执行的特点,即在同一时刻,多个线程可以同时执行。这种情况下,线程t2必须知道线程t1在访问共享变量s之前已经修改了共享变量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高手访谈系列到此结束,喜欢的朋友记得点赞收藏哦。另外,大家有什么技术或者专业开发相关的问题,可以私信我,我会尽快回复。版权声明:除特别声明外,本博客所有文章均采用CCBY-NC-SA4.0许可协议。转载请注明来自Mic带你学建筑!如果本文对您有帮助,请给个关注和点赞。您的坚持是我不断创作的动力。欢迎关注同名微信公众号获取更多技术干货!