wait/notify/notifyAll 方法的使用注意事项

为什么 wait 必须在 synchronized 保护的同步代码中使用?

在使用 wait 方法时,必须把 wait 方法写在 synchronized 保护的 while 代码块中,并始终判断执行条件是否满足,如果满足就往下继续执行,如果不满足就执行 wait 方法,而在执行 wait 方法之前,必须先持有对象的 monitor 锁,也就是通常所说的 synchronized 锁。

 synchronized (obj) {
     while (condition does not hold) {
         obj.wait();
     }
     ... // Perform action appropriate to condition
}

那么设计成这样有什么好处呢?

先看一段代码:

// 典型的生产者消费者的思想
class BlockingQueue {
    Queue<String> buffer = new LinkedList<String>();

    public void add(String data) {
        buffer.add(data);
        notify();  
    }
    
    public String remove() throws InterruptedException {
        while (buffer.isEmpty()) {
            wait();
        }
        return buffer.remove();
    }
}

这段代码的问题在哪里呢?这段代码并没有受 synchronized 保护,于是便有可能发生以下场景:

1,首先,消费者线程调用 remove 方法并判断 buffer.isEmpty 方法是否返回 true,

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值