admin管理员组文章数量:1123008
wait
原理之 wait/notify
owner线程发现条件不满足,调用wait方法,即可进入waitset变为 waiting状态
blocked 和 waiting 的线程都处于阻塞状态,不占用CPU时间片
blocked线程会在owner线程释放锁时唤醒
waiting线程会在owner线程调用notify或notifyall时被唤醒,但唤醒后并不意味着立即获得锁,仍然需要进入EntryList重新竞争者
相关API的介绍
obj.wait() 让进入object监视器的线程到waitSet等待
obj,notify() 在object上正在waitSet等待的线程中挑一个唤醒
obj.notifyAll() 让object上正在waitSet等待的线程全部唤醒
他们都是线程之间协作的手段,都属于object对象的方法,必须获得对象的锁,才能调用这几个方法
wait 和 sleep的区别
sleep 是 thread的方法 而wait是object的方法
sleep不需要强制和synchronized配合使用,但wait需要和synchronized一起使用
sleep在睡眠的同时,不会释放对象锁的,但wait在等待的时候会释放对象锁
它们的状态都是一样的,timed waiting
wait-notify 运用机制
实例 送烟的问题
使用wait和notify 配合使用 while 防止虚假唤醒
实例(添加链接描述)
3)优雅地使用 wait/notify
什么时候适合使用wait
当线程不满足某些条件,需要暂停运行时,可以使用 wait 。这样会将对象的锁释放,让其他线程能够继续运行。如果此时使用 sleep,会导致所有线程都进入阻塞,导致所有线程都没法运行,直到当前线程 sleep 结束后,运行完毕,才能得到执行。
使用wait/notify需要注意什么
当有多个线程在运行时,对象调用了 wait 方法,此时这些线程都会进入 WaitSet 中等待。如果这时使用了 notify 方法,可能会造成虚假唤醒(唤醒的不是满足条件的等待线程),这时就需要使用 notifyAll 方法
synchronized (lock) {while(//不满足条件,一直等待,避免虚假唤醒) {lock.wait();}//满足条件后再运行
}synchronized (lock) {//唤醒所有等待线程lock.notifyAll();
}
本文标签: wait
版权声明:本文标题:wait 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/biancheng/1701374028a387735.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论