为什么wait和notify只能在synchronized中?
发布时间:2021-05-21 06:01:34 所属栏目:大数据 来源: https://www.jb51.cc
导读:前言 wait和notify必须在synchronized块中,否则会抛出IllegalMonitorStateException。 原因 代码示例 class BlockingQueue { QueueString buffer = new LinkedListString(); public void give(String data) { buffer.add(data); notify(); } public String
前言wait和notify必须在synchronized块中,否则会抛出IllegalMonitorStateException。 原因代码示例
代码示例的问题所在一个消费者调用take,发现buffer.isEmpty。 关键总是让give/notify和take/wait为原子操作。wait/notify是线程之间的通信,他们存在竞态,我们必须保证在满足条件的情况下才进行wait。换句话说,如果不加锁的话,那么wait被调用的时候可能wait的条件已经不满足了(如上述)。由于错误的条件下进行了wait,那么就有可能永远不会被notify到,所以我们需要强制wait/notify在synchronized中。 (编辑:北几岛) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |