转载

wait为什么建议和while一起使用

分析这个问题时建议先学习jdk中的 BlockingQueue ,熟悉阻塞队列

以下面的代码为例,假设这是一个生产者的代码

public void put(Object obj) throws InterruptedException{
    synchronized (this) {
        while(count == items.length)
            this.wait();
        inqueue(obj);
    }
}

场景:

items中的元素已满

现在有两个生产者线程

分析:

当前两个生产者线程向队列中添加数据时,由于队列已满,因此都会执行wait方法(释放锁,线程进入waiting状态)

若此时一个消费者线程消费了一个数据,那么两个waiting状态的生产者线程会进入Runnable状态,线程1抢占锁,添加数据,释放锁,紧接着线程2获取锁,此时注意由于是 if ,因此直接继续向下执行,但队列已经满了

原文  https://segmentfault.com/a/1190000021101461
正文到此结束
Loading...